输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
最开始想 和1做与运算 然后位右移 没有通过测试 是因为负数位右移用1来补位,导致判断没法终止。所以换一种方法
还是和1做与运算,但是1位左移,一直到1位左移变成0为止,如果位运算结果不是0,计算结果➕1;
public class Solution { public int NumberOf1(int n) { int base = 1; int sum=0; while(base != 0){ if((n&base) != 0){ sum ++; } base=base << 1; } return sum; } }
记录一种网上方法:
把n减1然后和原先的n进行与运算,运算结果不为0说明有一个位为1,循环往复
例:n的二进制表示为 1110 减1后为 1101 然后1110和1101进行与运算结果为1100 一次运算可以说明有一个1 ,这样下去就可以找到所有的1;
public class Solution { public int NumberOf1(int n) { int count=0;
//只要n不为0,就说明有一个位为1 while(n!=0){ count ++; n = n&(n-1); } return count; } }