用位运算求给定整数的二进制表示中1的个数
2013-07-01 00:25
337 查看
用位运算求给定整数的二进制表示中1的个数
考虑到n-1会把n的二进制表示中最低位的1置0并把其后的所有0置1,同时不改变此位置前的所有位,那么n&(n-1)即可消除这个最低位的1。这样便有了比顺序枚举所有位更快的算法:循环消除最低位的1,循环次数即所求1的个数。此算法的时间复杂度为O(n的二进制表示中的1的个数),最坏情况下的复杂度O(n的二进制表示的总位数)。
//计算n的二进制表示中1的个数
int count1(unsignedint n)
{
intr = 0;
while(n)
{
n &= n-1; //每运算一次消去最后一个1
r++;
}
returnr;
}
ont-size:9.0pt'>
考虑到n-1会把n的二进制表示中最低位的1置0并把其后的所有0置1,同时不改变此位置前的所有位,那么n&(n-1)即可消除这个最低位的1。这样便有了比顺序枚举所有位更快的算法:循环消除最低位的1,循环次数即所求1的个数。此算法的时间复杂度为O(n的二进制表示中的1的个数),最坏情况下的复杂度O(n的二进制表示的总位数)。
//计算n的二进制表示中1的个数
int count1(unsignedint n)
{
intr = 0;
while(n)
{
n &= n-1; //每运算一次消去最后一个1
r++;
}
returnr;
}
ont-size:9.0pt'>
相关文章推荐
- 计算机程序的思维逻辑 (4) - 整数的二进制表示与位运算
- 金山笔试题 "写一个函数,对给定整数的二进制表示进行描述"
- 给定两个正整数(二进制形式表示)A和B,问把A变为B需要改变多少位(bit)?也就是说,整数A和B的二进制表示中有多少位是不同的?
- 给定一个整数N,求N!末尾有多少个0?N!的二进制表示中最低1的位置?
- 统计给定整数的二进制表示中1的个数
- 给定你任意正整数,请你输出这个正整数的二进制表示中有几个1。
- 计算机程序的思维逻辑 (4) - 整数的二进制表示与位运算
- 给定一个整数,求它的二进制表示中有多少个1。
- 【编程之美】任意给定一个32位无符号整数n,求n的二进制表示中1的个数
- 给定一个整数,求它的二进制表示
- 给定一个整数N,那么N的阶乘N!末尾有多少个0呢?求N!的二进制表示中最低位1的位置。
- 统计给定整数的二进制表示中1的个数
- 给定两个正整数(二进制形式表示)A和B,问把A变为B需要改变多少位(bit)?也就是说,整数A和B的二进制表示中有多少位是不同的?
- 给定两个正整数(二进制形式表示)A和B,问把A变为B需要改变多少位(bit)?也就是说,整数A和B的二进制表示中有多少位是不同的?
- 【转载】计算机程序的思维逻辑 (4) - 整数的二进制表示与位运算
- 给定一个整数,输出这个整数二进制表示中1的个数
- 逆转一个整数的二进制表示问题
- 4.输入一个整数a,再输入两个整数p(p<32),v(0|1),将该整数a的p位设置为v,输出修改后的该整数的二进制表示.
- 程序员面试题精选100题(22)-整数二进制表示中1的个数[算法]
- 给定一个正整数,找出一个数:与其二进制表示中1的个数相同,比该数小,而且最接近