C++位运算:求 int 绝对值
对应力扣题目:
- 编写一个方法,找出两个数字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 绝对值相关推荐
- java中取整数绝对值_Java之——位运算求整数绝对值
通过下面的位运算可以得到一个整数的绝对值 public int abs( int a ) { return (a + (a >> 31)) ^ (a >> 31) ;//前半部 ...
- 位运算求整数中二进制1的个数
package _位运算;public class _位运算求整数中1的个数 {public static void main(String[] args) {int n = 4;int ans = ...
- 位运算求两个数的平均值
一直不理解位运算求两个数的平均值.参考网上资料后终于明白. 如下: 求两个数的平均值的算法:Avg = (ValueA & ValueB) + (ValueA ^ ValueB) >&g ...
- 用位运算实现四则运算之加减乘除(用位运算求一个数的1/3)
听同学百度二面中,不准用四则运算操作符来实现四则运算.一想就想到了计算机组成原理上学过的.位运算的思想可以应用到很多地方,这里简单的总结一下用位运算来实现整数的四则运算. 加法运算: int AddW ...
- java位运算求幂,程序员必学:快速幂算法
前阵子,有小伙伴在我B站的算法教程底下留言 小伙伴们有任何疑问或者希望我解说任何内容,都可以在我的小我私家B站或民众号(xmg_mj)留言哦,我会尽我最大能力.只管抽时间去写文章\录视频来回应人人. ...
- 给力!高效!易懂!位运算求组合
本篇摘要 本篇介绍一个非常给力的求组合的算法!上一篇"c_c++刁钻问题各个击破之位运算及其实例(2)"介绍了6个比较复杂的位操作,但是没有给出任何应用实例,本篇就之前谈到的位操作 ...
- java int越界_用位运算判断int类型变量越界
今天在做一道oj题的时候,遇到了一个情景,需要判断经过操作后的int类型数是否越界.我直接很暴力地比较和int类型的最大最小值来判断是否越界.但还想思考一下用位运算判断是否越界的方法,顺便巩固一下位运 ...
- c通过位运算求绝对值_初中数学归类总结(四)有理数的乘除乘方及混合运算...
学习了有理数的加减运算以后,再来进行有理数的乘除,就比较容易理解和运算了. 首先我们来看有理数的乘法法则:两数相乘,同号得正,异号得负,并把绝对值相乘:任何数与零相乘,积仍为0.有理数乘法法则和有理数 ...
- c语言char float混合类型运算,求int long char double float 在混合运算中的自动转换规则 win 32位系统。...
满意答案 yesyesq 推荐于 2018.05.11 采纳率:40% 等级:9 已帮助:1063人 在程序运行中,变量的数据类型是可以转换的,转换方式有两种. 一.自动转换:自动转换发生在不同 ...
最新文章
- 把Ubuntu 9.04版本的Samba 服务器加入到Active Directory中
- listview 滑动以后设置最上面一行为整行展示
- YBTOJ:圈套问题(分治法、鸽笼原理)
- 工作379-回调日期补0操作
- Delphi TStream 详细介绍
- Safari 最新技术预览版来啦,为开发者带来了哪些新功能?
- 不好好写代码,就只能回去当总理了!
- Python中,os.listdir遍历纯数字文件乱序如何解决
- linux中断处理体系结构
- php arsort函数,php-常用函数
- java 群发求职邮件
- 计算机组成原理——微程序设计
- 没有事业的女人会很惨
- 实训十二:交换机隔离VLAN配置
- 下载安装electron和electron-builder遇到的问题及部分解决办法
- 【离散数学】单射、满射与双射
- window10 多桌面切换快捷键 win+tab
- 四阶龙格库塔方程(Rungekutta)解二阶常微分方程组并计算船舶在迎浪下的纵摇埀荡耦合运动方程-附Matlab代码
- 【泛函分析】Riemann积分与Lebesgue积分
- 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java图书推荐系统93gei
热门文章
- java之家_java
- linux快速mysql5.7_Linux下安装MySQL 5.7
- 【Oracle】redo与undo
- Promise--优雅的异步回调解决方案
- 80端口未被占用,无法启动wamp的解决方法(原创)
- Bad owner or permissions on .ssh/config win10问题解决
- 利用PDF.JS插件解决了本地pdf文件在线浏览问题(根据需要隐藏下载功能,只保留打印功能)
- webpack-dev-server 设置反向代理解决跨域问题
- 解决 Chrome 下载不了东西 失败 - 已屏蔽 的问题
- vue2强制刷新,解决页面不会重新渲染的问题