位运算--一个整数的二进制表示中1的个数

来源:互联网 发布:软件腰带剑开刃报价 编辑:程序博客网 时间:2024/05/11 20:19

题意:请实现一个函数,输入一个整数,输出该数二进制表示中1 的个数。例如把9 表示成二进制是1001,有2 位是1,因此如果输入9,该输出2 。

解法一:flag=1,将整数n与flag做位与,判断位与结果是否为1,为1则计数加一;flag左移一位,再重复前面步骤,直到flag为0。要循环机器字的位数次。这是常规解法,但不算最优解。

解法二:注意到一个二进制数减一后,该数的第一个非0位会变成0,该非0位的右边的所有位都由0变成1,左边的所有位保持不变。然后将减一后的数与减一前的数做位与,这样就将减一前的数的最右边的非0位变为0,其他位保持不变。所以通过这种方式就能统计出一个二进制数中1的位数。代码如下:

int numberOfOne(int n){int count;while(n){count++;n=(n-1)&n;}return count;}
技巧:把一个整数减去1 之后再和原来的整数做位与运算, 得到的结果相当于是把整数的二进制表示中的最右边一个1变成0。很多二进制的问题都可以用这个思总解决。

扩展:(1)用一条语句判断一个整数是不是2 的整数次方。一个整数如果是2的整数次方, 那么它的二进制表示中有且只有一位是1, 而其他所有位都是0 。 根据前面的分析, 把这个整数减去1 之后再和它自己做与运算,这个整数中唯一的1 就会变成0。

(2)输入两个整数m 和n ,计算需要改变m 的二进制表示中的多少位才能得到n . 比如10 的二进制表示为1010 ,13的二进制表示为1101,需要改变1010 中的3 位才能得到1101 . 我们可以分为两步解决这个问题:第一步求这两个数的异或, 第二步统计异或结果中1的位数。

0 0