如何求一个数的补数
来源:互联网 发布:mac dock栏 图标消失 编辑:程序博客网 时间:2024/04/29 21:10
发现了一个问题自己还不是很懂,就是说如何求一个数的补数,举个例子,比如5,二进制是101,那么它的补数就应该是010就是2。
你可能会问了,这不是很简单吗?取反就行了啊,~5就行,事实上是这样子吗?当然不是了,因为5是101,但是它前边还有很多0。
如果按照无符号int来看的话,是32个bit。
为了简单,我们只写最后8个bit,是
0000 0101
那么它的补数2就是
0000 0010。
但是对5取反之后得到的是:
11111010
显然,取反是错误的。那么怎么做才是对的呢?
偷偷瞄了一眼答案。
第一步:寻找一个掩码(mask)
要找的这个掩码的特征应该是这个样子的。5的二进制是101,只占3个bit,那么这个掩码的最后3个bit要是0,其余全部是1。如下所示:
5:0000 0101
掩码:1111 1000
第二步:分别取反
~5 :1111 1010
~掩码:0000 0111
第三步:相与
~5 & ~掩码 = 0000 0010
代码如下:
class Solution {public: int findComplement(int num) { unsigned mask = ~0; //掩码初始为二进制全部是1 while(num & mask) mask <<= 1; //左移掩码 return ~num & ~mask; }};
特此记录,谨防忘记
阅读全文
3 0
- 如何求一个数的补数
- 求一个数的反序数
- 求一个数的反序数
- 求一个数的回文数
- 如何求一组数的逆序数
- 在一个数的左侧补0
- 求一个数的阶乘
- 求一个数的最小公倍数
- 求一个数的最大公约数
- 求一个数的阶乘
- 求一个数的阶乘
- 求一个数的平方
- 求一个数的阶乘
- 求一个数的质因数
- 求一个数的二进制
- 求一个数的阶乘
- 求一个数的阶乘
- 求一个数的阶乘
- CodeForces 699A
- FFmpeg搭建开发环境
- Google正资助一个由AI机器人编辑的新闻网站
- Docker源码分析(二)之Docker Client
- CentOS7.2下SSL证书的配置
- 如何求一个数的补数
- 时间序列数据的首选神经网络
- for和while的区别与面试点
- 毕业整理思路
- 什么时候用@Resource,什么时候用@service
- 古文觀止卷七_獲麟解_韓愈
- android scrollview 滚动到指定位置
- java集合类内容总结
- HTML入门笔记21-HTML定义列表