美文网首页
11. 二进制中的一个数

11. 二进制中的一个数

作者: 丶沧月 | 来源:发表于2019-03-13 22:32 被阅读0次

    题目描述

    输入一个整数,输出该数二进制表示中 1 的个数。
    原码反码补码
    可能是最通俗易懂的 Java 位操作运算讲解

    解题思路

    代码实现

    会陷入死循环的解法

    如果是负数,因为最高位一直是 1 ,所以会陷入死循环

    public class Solution {
        public int NumberOf1(int n) {
            int count = 0;
            while (n > 0) {
                if ((n & 1) == 1) {
                    count ++;
                }
                n >>= 1;
            }
            return count;
        }
    }
    

    改善

    public int NumberOf1(int n) {
        int count = 0;
        // 需要右移32次 
        int x = 32;
        while (x-- != 0) {
            count += n & 1;
            n >>= 1;
        }
            
        return count;
    }
    

    n&(n-1)

    该位运算去除 n 的位级表示中最低的那一位。

    n : 10110100
    n-1 : 10110011
    n&(n-1) : 10110000

    时间复杂度:O(M),其中 M 表示 1 的个数。

    public int NumberOf1(int n) {
        int cnt = 0;
        while (n != 0) {
            cnt++;
            n &= (n - 1);
        }
        return cnt;
    }
    

    相关文章

      网友评论

          本文标题:11. 二进制中的一个数

          本文链接:https://www.haomeiwen.com/subject/vbixmqtx.html