[LeetCode]problem 191. Number of 1 Bits

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值