二进制中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++;
}

浙公网安备 33010602011771号