剑指Offer算法题-二进制中1的个数

发布于 / 刷题 / 0 条评论

题目描述

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

题解

这道题用位运算会比较简单,对于正数,将这个数与0x00000001进行与运算,即可判断最低位是否为1,接着将数字右移一位,继续判断。对于补码负数,直接右移一位会导致最高位始终为一,发生死循环。因此要与0x80000000(二进制的1000.....0000)进行与运算,判断数字是否非0,并左移,从高位判断。

class Solution {
public:
    int NumberOf1(int n){
        int result = 0;
        if(n == 0) return 0;
        if(n > 0){
            while(n){
                result += n & 0x00000001;
                n >>= 1;
            }
        }else{
            while(n){
                result += !!(n & 0x80000000);    //判断是否非0
                n <<= 1;
            }
        }
        return result;
    }
};

转载原创文章请注明,转载自: 斐斐のBlog » 剑指Offer算法题-二进制中1的个数
目前还没有评论,快来抢沙发吧~