二进制中1的个数

前言

本来是打算次条每天更新面试题和算法刷题的,加上头条一共要三篇文章,实在更不来,而且两篇都看的人也不多,所以我就算法刷题和面试题论着更新,更新的时候多更新几道。

题目描述

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

解答

方法1

让 n 和 000....001,相与判断第一位是不是 1 ,然后和 00....010相与判断第二位是不是 1,以此类推。代码如下:

    public int NumberOf1(int n) {
        int count = 0;
        int k = 1;
        while (k != 0) {
            if ((n & k) != 0) {
                count++;
            }
            k = k << 1;
        }
        return count;
    }

方法2

这个方法就比较牛逼了,可以说是最优解,直接看代码,如果不懂的可以自己找几个数字演示下,就能够理解了。

    public int NumberOf12(int n) {
        int count = 0;
        int k = 1;
        while (n != 0) {
            count++;
            n = (n - 1) & n;
        }
        return count;
    }

其实有很多题是可以利用位的异或来解决的,大家可以思考下平时遇到哪些题是用这种方法解决的,我后面会给出几道题,这些题都可以用异或位运算巧妙解决。发的另一道题也用到了位运算。

其实我是想跟大家说,做题的时候,有时候想想是否可以用位运算来解决。

posted @ 2019-03-15 20:34  帅地  阅读(212)  评论(0编辑  收藏  举报