位操作:一个整数的二进制表示中 有多少个1?
2012-04-25 19:16
267 查看
#include <stdio.h> int countHowMuchOne( int number ) { int count = 0; while ( number ) { number = number & ( number-1 ); ++count; } return count; } int main() { int num = 11; int count = 0; count = countHowMuchOne( num); printf("%d'binary format has %d bit 1 \n", num, count); return 0; }
// 解答
若一个数最右边一位为1,例如 x = 011011,x-1 = 011010,两者做&操作,会将最右边一位1消掉
若一个数最右边一位为0, 例如 x = 101100,x-1 = 101011,两者做&操作,同样会将最右边的一位1消掉
因为减一操作使得,原来的数x 的最低位从右向左直到遇到一个1,这些bit位都会取反,做&操作会将最右边的一位1消掉
#include <stdio.h>
int countHowMuchOne2( int number )
{
int count = 0;
int lastBit = 0;
while ( number )
{
lastBit = number & 1;
if ( lastBit )
{
++count;
}
number = number >> 1;
}
return count;
}
int main()
{
int num = 11;
int count = 0;
count = countHowMuchOne2( num);
printf("%d'binary format has %d bit 1 \n", num, count);
return 0;
}// 解答 思路二:每次取最后一位和1与运算,若结果为1,说明末尾为1,否则末尾为0
// 扩展问题,如何判断一个数是否是2的n次方? 即: x ?= 1 << n
#include <stdio.h> int func(int x) { if( (x&(x-1)) == 0 ) return 1; else return 0; } int main() { int x = 8; printf("%d\n", func(x)); }
// 解答
一个数是2的n次方,则其二进制表示中最高位为1,其余位为0,而且只有一个1,那么 x&(x-1)必为0
// 其他关于位操作的例子
如何快速得到一个数的7倍? 答案: x << 3 - x
相关文章推荐
- 给定一个整数N,求N!末尾有多少个0?N!的二进制表示中最低1的位置?
- 给定一个整数,求它的二进制表示中有多少个1。
- Java算法总结:输入一个整数,求该整数的二进制表示中有多少个1
- 191. Number of 1 Bits (计算一个整数的二进制表示中有多少个1)
- 23:一个整数的二进制表示中有多少个1
- 计算一个整数的二进制表示有多少个1(别人的最快算法)
- 输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。
- 给定一个整数N,那么N的阶乘N!末尾有多少个0呢?求N!的二进制表示中最低位1的位置。
- 输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。
- 输入一个整数,求该整数的二进制表示中有多少个1
- 28.整数的二进制表示中1的个数 题目:输入一个整数,求该整数的二进制表达中有多少个1。 例如输入10,由于其二进制表示为1010,有两个1,因此输出2。
- 输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n
- 2.3题目:输入一个整数a,再输入两个整数p1,p2(p1,p2<32),将该整数的二进制表示方法中从右端开始的p1到p2位取反后输出
- 计算将一个十进制整数转换成二进制含多少个1
- 逆转一个整数的二进制表示问题
- 逆转一个整数的二进制表示问题
- 1.输出一个整数的每一位。2. 编程实现: 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
- 求整数 在二进制表示中有多少个1的方法
- 求一个整数的二进制形式会有多少个1
- 给定两个正整数(二进制形式表示)A和B,问把A变为B需要改变多少位(bit)?也就是说,整数A和B的二进制表示中有多少位是不同的?