题目描述:
输入一个32位整数,输出该数二进制表示中1的个数。
注意:负数在计算机中用其绝对值的补码来表示。
样例1 输入:9 输出:2
解释:9的二进制表示是1001,一共有2个1。
样例2 输入:-2 输出:31
解释:-2在计算机里会被表示成11111111111111111111111111111110, 一共有31个1。
分析:
先判断整数二进制表示中最右边一位是不是1,然后右移一位,原来处于第二个位置的数被移到最右边判断该位是不是1,这样每次移动一位,直到数变为0为止。
如何判断一个整数 的最右边是不是1.?
将该数和1做与运算(有0则0),因为1的二进制除了第一位为1其余均为0,如果一个整数与1与运算之后的结果为1则证明最右侧位置的数是1,否则是0。
为了避免输入的数是负数,负数在右移时要确保最高位是1,所以不会出现数变成0的情况,会陷入死循环。因此数字不变,对1左移。
public int NumberOf1(int n){
int count=0;
int num=1;
while(num!=0) {
if((n&num)!=0)
count++;
num=num<<1;
}
return count;
}
算法2:把一个整数减去1再和原整数做二进制与运算,会把该整数最右边的1变成0。一个整数的二进制表示中有多少个1就可以进行多少次这种操作。比如1100减1变成1011 1100&1011=1000
public int NumberOf1(int n){
int count=0;
while(n!=0) {
count++;
n=(n-1)&n;
}
return count;
}
相关题目:
- 判断一个整数是不是2的整数次方。
如果一个整数是2的整数次方,那么该整数的二进制表示中有且仅有一个1,而其他所有位都是0。所以将这个整数减1然后和原整数做与运算,这个整数中唯一的1就会变成0. - 输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n。
解决办法:对两个数做异或操作(相同为0,相异为1);统计异或结果中1的位数。
版权声明:本文为hahaEverybody原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。