编程之美之"二进制数中1的个数"

解法1

我们希望算法的复杂度只和二进制中1的个数有关。

如何只对二进制数中的1进行操作呢?

给定一个数: a = 0xxxxxx100000
b = a - 1 = 0xxxxxx011111
c = a & b = 0xxxxxx000000

可以看到1被消除了,因此每进行这样一次操作,消耗二进制数中的一个1,利用这种操作,当c等于0的时候,我们就可以得到二进制数中1的个数。

代码如下:

private static int numOne(int v){
        int num = 0;
        while(v!=0){
            v &= (v-1);
            num++;
        }
        return num;
    }

扩展问题1

给定两个正整数A和B,问把A变为B需要改变多少位?

问题分析

原问题等价于正整数A和B中二进制表示中有多少位是不同的。

解决方法

C = A XOR B; // C的二进制数中1表示A和B对应的二进制位是不同的。
res = numOne(C); // 统计C中1的个数

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 【1】7,9,-1,5,( ) A、4;B、2;C、-1;D、-3 分析:选D,7+9=16;9+(-1)=8;(...
    Alex_bingo阅读 19,627评论 1 19
  • 阿卜杜拉无法想象父亲也曾荡过秋千,也曾是个孩子,像阿卜杜拉一样的孩子,无忧无虑,无牵无挂,和小朋友们在野地里疯跑。...
    QIan书吧阅读 4,075评论 0 0
  • 清风明月不关饮 大梦方觉到天明 白露为霜
    蝶水月秋千阅读 2,828评论 0 0
  • 你住的城市下雨了,很想问你有没有带伞,可是,我忍住了。因为我怕你说没带,而我又无能为力,就像是我爱你,却给不到你想...
    久暂叔叔阅读 1,612评论 0 1

友情链接更多精彩内容