快速的判断一个数N的二进制中有多少个1

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/si444555666777/article/details/82253837

方法1:

这里涉及一个&的知识点,&是按位与,就是在一位一位的做与运算,
while(n>0) //这一句,当n不等于0的时候循环执行以下循环体,n等于0的变化条件在n>>=1这一句,将n左移一位,这样当n中所有的”1”位都移出时,就跳出循环了
{
if((n&1)==1) //这句逐个通过位与的方式查看当前n最左边的一位是不是1,若是,则n&1=1,c加1用来计数
c++;
n>>=1;
}
return c;//这样循环结束时就能得到所需的1的个数了
需要注意的是循环条件这部分很巧妙,保证当n的右边没有1的时候就不做循环了,可以假设n=1,循环体就只执行一次就跳出了,而不用遍历n的每一位

方法2:

x=x&(x-1)

表达式的意思就是:把x的二进制表示 从低位开始,将遇到的第一个为1的比特位 置0。

例如:

e1:
x = 01001000
x-1 = 01000111
x&(x-1)=01000000

e2:
x = 01001001
x-1 = 01001000
x&(x-1)=01001000

在循环中利用该表达式可以快速的判断一个数的二进制中有多少个1。

int func(x)
{
int countx = 0;
while(x)
{
countx ++;
x = x&(x-1);
}
return countx;
}

x=x&(x-1)还可以快速判断x是不是2^n。当x为unsigned类型的变量,且其值为2的n次幂的时候,结果为零

猜你喜欢

转载自blog.csdn.net/si444555666777/article/details/82253837