对应力扣题目:

  • 编写一个方法,找出两个数字a和b中最大的那一个。不得使用if-else或其他比较运算符

参考自解答:

  • dexin的解答

如何使用位运算对整数求绝对值呢?

  • 对于正数,数值是其本身;
  • 对于负数,需要求反码,然后加一。

这是因为在C++整数中,数值是以“补码”这种形式存储的,对于8位的int,如下表。

二进制表示 符号位 数值位 对应整数数值
0000 0001 0 000 0001 1
0000 0010 0 000 0010 2
1111 1111 1 111 1111 -1
1111 1110 1 111 1110 -2

对于1111 1111,将其取反0000 0000,再加1,得0000 0001,即将-1转换成了+1

求 int 的绝对值操作如下

int abs(int k) {return k ^ (k >> 31) - (k >> 31);
}

解释如下:

  • 首先,k>>31代表将有符号的数组右移31位:
    • 因为 int 一共有32位,其中最高位是符号位,代表正负;
    • 对于正数,k >> 31后即为0000 0000 0000 0000 0000 0000 0000 0000,而对于负数,k >> 31后即为1111 1111 1111 1111 1111 1111 1111 1111
  • 接着,a = a ^ b 表示异或:
    • b为全0时,该操作相当于没做;
    • b为全1时,该操作相当于取反码;
  • 最后,a - b运算实则不是位运算,属于整数运算:
    • b为全0时,该操作相当于没做;
    • b为全1时,该操作相当于加1(-(-1))。

因此,上述操作也即是:

  • 对正数什么都没做;
  • 对负数取了负值。

这就是位运算的绝对值操作。

对于long类型,将31改成63即可。

这属于模板方法,应熟练。

C++位运算:求 int 绝对值相关推荐

  1. java中取整数绝对值_Java之——位运算求整数绝对值

    通过下面的位运算可以得到一个整数的绝对值 public int abs( int a ) { return (a + (a >> 31)) ^ (a >> 31) ;//前半部 ...

  2. 位运算求整数中二进制1的个数

    package _位运算;public class _位运算求整数中1的个数 {public static void main(String[] args) {int n = 4;int ans = ...

  3. 位运算求两个数的平均值

    一直不理解位运算求两个数的平均值.参考网上资料后终于明白. 如下: 求两个数的平均值的算法:Avg = (ValueA & ValueB) + (ValueA ^ ValueB) >&g ...

  4. 用位运算实现四则运算之加减乘除(用位运算求一个数的1/3)

    听同学百度二面中,不准用四则运算操作符来实现四则运算.一想就想到了计算机组成原理上学过的.位运算的思想可以应用到很多地方,这里简单的总结一下用位运算来实现整数的四则运算. 加法运算: int AddW ...

  5. java位运算求幂,程序员必学:快速幂算法

    前阵子,有小伙伴在我B站的算法教程底下留言 小伙伴们有任何疑问或者希望我解说任何内容,都可以在我的小我私家B站或民众号(xmg_mj)留言哦,我会尽我最大能力.只管抽时间去写文章\录视频来回应人人. ...

  6. 给力!高效!易懂!位运算求组合

    本篇摘要 本篇介绍一个非常给力的求组合的算法!上一篇"c_c++刁钻问题各个击破之位运算及其实例(2)"介绍了6个比较复杂的位操作,但是没有给出任何应用实例,本篇就之前谈到的位操作 ...

  7. java int越界_用位运算判断int类型变量越界

    今天在做一道oj题的时候,遇到了一个情景,需要判断经过操作后的int类型数是否越界.我直接很暴力地比较和int类型的最大最小值来判断是否越界.但还想思考一下用位运算判断是否越界的方法,顺便巩固一下位运 ...

  8. c通过位运算求绝对值_初中数学归类总结(四)有理数的乘除乘方及混合运算...

    学习了有理数的加减运算以后,再来进行有理数的乘除,就比较容易理解和运算了. 首先我们来看有理数的乘法法则:两数相乘,同号得正,异号得负,并把绝对值相乘:任何数与零相乘,积仍为0.有理数乘法法则和有理数 ...

  9. c语言char float混合类型运算,求int long char double float 在混合运算中的自动转换规则 win 32位系统。...

    满意答案 yesyesq 推荐于 2018.05.11 采纳率:40%    等级:9 已帮助:1063人 在程序运行中,变量的数据类型是可以转换的,转换方式有两种. 一.自动转换:自动转换发生在不同 ...

最新文章

  1. 把Ubuntu 9.04版本的Samba 服务器加入到Active Directory中
  2. listview 滑动以后设置最上面一行为整行展示
  3. YBTOJ:圈套问题(分治法、鸽笼原理)
  4. 工作379-回调日期补0操作
  5. Delphi TStream 详细介绍
  6. Safari 最新技术预览版来啦,为开发者带来了哪些新功能?
  7. 不好好写代码,就只能回去当总理了!
  8. Python中,os.listdir遍历纯数字文件乱序如何解决
  9. linux中断处理体系结构
  10. php arsort函数,php-常用函数
  11. java 群发求职邮件
  12. 计算机组成原理——微程序设计
  13. 没有事业的女人会很惨
  14. 实训十二:交换机隔离VLAN配置
  15. 下载安装electron和electron-builder遇到的问题及部分解决办法
  16. 【离散数学】单射、满射与双射
  17. window10 多桌面切换快捷键 win+tab
  18. 四阶龙格库塔方程(Rungekutta)解二阶常微分方程组并计算船舶在迎浪下的纵摇埀荡耦合运动方程-附Matlab代码
  19. 【泛函分析】Riemann积分与Lebesgue积分
  20. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java图书推荐系统93gei

热门文章

  1. java之家_java
  2. linux快速mysql5.7_Linux下安装MySQL 5.7
  3. 【Oracle】redo与undo
  4. Promise--优雅的异步回调解决方案
  5. 80端口未被占用,无法启动wamp的解决方法(原创)
  6. Bad owner or permissions on .ssh/config win10问题解决
  7. 利用PDF.JS插件解决了本地pdf文件在线浏览问题(根据需要隐藏下载功能,只保留打印功能)
  8. webpack-dev-server 设置反向代理解决跨域问题
  9. 解决 Chrome 下载不了东西 失败 - 已屏蔽 的问题
  10. vue2强制刷新,解决页面不会重新渲染的问题