题目:
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
解法:
利用二进制方法。n = n & (n-1) ,得到n用二进制表示后,去掉最低位的1的数字。
eg: n= 1111 0001 0000 ,经过上式后n=1111 0000 0000;
代码如下:
int NumberOf1(int n) {
if(n==0)
return 0;
int count = 0;
while(n!=0)
{
count++;
n = n &(n-1);// 去除 二进制表示中 最低位的1
}
return count;
}
拓展:
根据 公式 n = n & (n-1) 可以去掉最后一个二进制表示的1,可解决下列问题
1、一句话判断某个数字是否为2的整数次方。 因为2的整数次方的数在二进制表达中,只有某一项为1,利用n = n & (n-1) 可以得到0.
2、判断两个用二进制表达的整数m和n,需要改变m的二进制表达多少位才能得到n。
eg:m=10 -> 1010 , n =13 ->1101 ,需要改变3位。 直接计算m^n得到的二进制表达中1的个数。转换成题述问题。