[LeetCode]problem 191. Number of 1 Bits
2016-05-31 15:44
435 查看
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是否存在… 因为这种层次上优化,往往需要深厚的对编译的理解。此刻我还不懂,也暂时不必深究。
相关文章推荐
- linux高级原3
- Middle-题目21:62. Unique Paths
- Oracle varchar2 长度
- spring 整合 struts
- JavaScript学习--Item24 ES6新特性概览
- POJ 1515 双联通分量
- substring与substr
- 整理UWP中网络和设备信息获取的帮助类,需要的拿走。
- UITextFielddelegate委托方法注释
- javascript typeof 和 instanceof 的区别和联系
- Android系统启动-SystemServer下篇
- MongoDB User Asserts数量很大
- Android 内存泄露简介、典型情景及检测解决
- Hadoop网络拓扑
- Middle-题目20:153. Find Minimum in Rotated Sorted Array
- MEF搜索范围
- Runtime(六)拾遗
- Middle-题目19:309. Best Time to Buy and Sell Stock with Cooldown
- java与(&,&&)和或(|,||)的区别
- IOS file not found问题解决