关闭

[LeetCode]problem 191. Number of 1 Bits

135人阅读 评论(0) 收藏 举报
分类:

TAG

位操作

汉明重量 HammingWeight

link

方法

非常有背景的一道题。

讨论见stack-overflow

详细见维基百科-汉明重量 or Wikipedia-Hamming Weight

总的来说,这是经典的“汉明距离(Hamming Weight)”问题,由于在密码学、编码理论、信息论中常用到计算数据位中1的个数,所以有的CPU(X86)是有单独的指令(popcnt)来做这个操作的,GCC下有函数__builtin_popcount(unsigned int x), MSVC下有__popcnt(unsigned int value)(

代码

class Solution {
public:
    int hammingWeight(uint32_t n) {
        int oneBitCnt = 0 ;
        while(n)
        {
            if( (n & 1) == 1 ) { ++ oneBitCnt ;}
            n = n >> 1 ;
        }
        return oneBitCnt ;
    }
};

后记

上述代码实现是算是最LOW的方法,时间消耗上与使用__builtin_popcount(unsigned)方法相同(leetcode平台),耗时8ms;使用标准库std::bitset<32>(n).count()耗时4ms。

最后,上述代码有改进空间,就是去掉if语句: oneBitCnt += n & 1

理论上去掉if是更好的选择…我看维基百科中甚至有把循环展开写的…

! 结果更新,当我去掉if后,耗时变为4ms!当然,我不知道背后发生了什么… 不知道是if给流水带来的影响,还是编译器的优化.

说起优化,想起之前看到的一句话——不懂原理的优化简直就是邪恶。所以,咱们暂时就这么写着,以后也不必刻意在乎if是否存在… 因为这种层次上优化,往往需要深厚的对编译的理解。此刻我还不懂,也暂时不必深究。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    有什么值得去写?

    一位师兄以前说,现在互联网上的各种教程都是相互拷贝,一堆垃圾,根本没有写的必要。我想想觉得也很有道理。

    如果你只是记录下一个软件的安装过程,那还不如去看官方文档。但是如果你加上遇到的坑以及解决办法,那么这或许是一篇有意义的文章。如果你只是记录下一个函数简单用法,那怎么不去看官方文档(确实我现在都是去官方文档看)?但是如果你加上一些这个函数常用场景,用起来的漂亮代码,内部实现原理,那么这篇文章也是有意义的。

    最近因为找工作,在刷LeetCode。以前我还从网上找题解,后来我直接在DISCUSS上看HOT就好了。那我记录有何理由?我可以记录思考过程,可以考虑代码的优化,可以展示清晰易读标准C++11的代码

    个人资料
    • 访问:65337次
    • 积分:1686
    • 等级:
    • 排名:千里之外
    • 原创:104篇
    • 转载:13篇
    • 译文:0篇
    • 评论:13条