二进制中1的个数 --剑指offer

输入一个整数,输出该数二进制表示中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; } }

猜你喜欢

转载自www.cnblogs.com/nlw-blog/p/12417794.html