二进制中1的个数

准备工作:

1.负数的二进制怎么算?

负数在计算机中用其绝对值的补码来表示。

怎么算一个数的补码呢?

正整数的补码是其二进制表示,与原码相同

负整数的补码是将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1。

0的补码唯一为0.

举个例子:求-9的补码

首先求-9的绝对值9的二进制表示:00000000 0000000 00000000 00001001

其次所有位取反:11111111 11111111 11111111 11110110

最后加1:11111111 11111111 1111111 11110111

得到的就为-9的补码。

 2.&作为位运算符的含义为按位与。真真的真,其他情况为0

解题:

 

有两种写法:n&(n-1)和n&(-n)都可以把最低位为1的改为0

n&(n-1)作用:将n的二进制表示中的最低位为1的改为0,以9为例:

n=9,二进制表示为1001。则(n-1) =8,二进制表示为 1000 ,n&(n-1) = 1000
最后一位的1在经过运算后变为了0。

n&(-n)作用:

-n =-9,二进制表示为0111,如果n&(-n)=1,则说明n的二进制表示中某一位1为1, n -= n &(-n)则是把最低位的1改为0.

 

可以应用于本题,求解二进制中1的个数。

int res=0;

两种解法:

第一种:

 while (n) {
            n -= n &(-n) ;
            res ++;    
}

第二种:
while (n ) {

//把最低位为1的数变为0,如果还n还大于0,说明还有位为1.
      n &= (n-1);

  res++;
}

 

posted @ 2020-04-13 17:38  毛毛吃火锅不要锅  阅读(410)  评论(0)    收藏  举报