输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
方法1:依次右移,使最右侧的1依次消失。但需要注意负数右移后会在高位补1,需要将负数转换为无符号数。
int NumberOf1(int n)
{
int cnt = 0;
unsigned ui = (unsigned)n; //转换为无符号数
while (ui!=0)
{
int a = ui & 1; //与1做位与运算
if (a == 1) //最后一位为1
cnt++;
ui = ui >> 1; //右移
}
return cnt;
}
方法2:与n-1相与,同样可以使最右侧的1消失。n-1可以从最右侧的一个1开始,让所有位取反。n&(n-1)后可以让最右侧的1消失。
int NumberOf1(int n)
{
int cnt = 0;
while (n!=0)
{
n = n&(n - 1);
cnt++;
}
return cnt;
}