c语言位运算 求1个整数的二进制数有多少个1
2013-05-07 01:27
363 查看
今日见到1个函数, 它的作用是求1个整数的二进制数有多少个1.
函数如下:
unsigned long fun(unsigned long x) { int count = 0 ; while(x) { count++; x = x & (x - 1); } return count; }
看了半小时才看懂, 关键是那个 x = x & (x - 1)的意就是把x 化为二进制数后, 把最右边的1变成0.
这样整个函数就很容易明白了。
问题就是 x = x & (x - 1) 为何会把x 的二进制最右边的1变成0呢?
首先& 是1个位运算符, 注意跟逻辑运算符 && 的区别啊。
& 的叫做“位与”, 它的规则就是 如果两个位都是1 则返回1, 否则返回0
也就是说
1 & 1 == 1;
0 & 0 == 0;
1 & 0 == 0;
0 & 1 == 0;
10011101
& 10101000
——————————
10001000
我们把假定 x 的二进制数是A1B, 其中B是n个0(n是任意非负整数)。 而A不受限制
假如 A是1001 B是3个0, 那么 x就是 10011000了
而且A和B中间那个1就是这个二进制数的最右边的1, 因为B是n个0嘛。
那么 x-1 就肯定是 A0C了, C是n个1.
比如 上面的例子 10011000 - 1 == 10010111 所以 C就是3个1了。
所以x & (x -1) 就是
A1B
& A0C
___________
A0B
就如 10011000
& 10010111
————————
10010000
最终A0B 比起A1B就是去掉最右边的1个1啊, 就是这样证明的。
https://sgsinm02.tcs.com/
相关文章推荐
- 十进制整数,计算对应的二进制数包含多少个1
- 问题:十进制整数,计算对应的二进制数包含多少个1,用位操作。
- 给定n个整数,从中选出1个或多个,使选出整数的乘积是完全平方数。一共有多少种选法? 例如,{4,6,10,15}有3种4、6、10、15和4、6、10、15。
- 十进制整数,计算对应的二进制数包含多少个1,用位操作
- 判断一个整数的二进制数有多少个1
- 牛牛和15朋友来玩打土豪分田地的游戏,牛牛决定让你来分田地,地主的田地可以看成是一个矩形,每个位置有一个价值。分割田地的方法是横竖各切三刀,分成26份,作为领导干部,牛牛总是会选择其中总价值最小的一份田地,作为牛牛最好的朋友,你希望牛牛取得的田地价值和尽可能大,你知道这个值最大可以是多少吗? 输入两个整数n和m(1≤n,m≤75)表示田地的大小,接下来n行,每行包括m个0-9之间的数字,表示每块
- 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
- 求一个正整数,存在多少种质数对之和==该正整数
- 统计整数的二进制表达里有多少个1 Python版
- 求该整数的二进制表达中有多少个1
- 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
- 如何求整数A和B的二进制表示中有多少位不同?
- Java算法总结:输入一个整数,求该整数的二进制表示中有多少个1
- C语言实例2——一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
- 实现一颗二叉树的层序遍历/给定一个整数N,那么N的阶乘N!末尾有多少个0呢
- 【微软100题】输入一个整数,求该整数的二进制表达中有多少个1
- 试求和为N,积为最大两个整数分别为多少?
- 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
- 编程实现: 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
- 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少