求一个整数中的二进制1的位的个数
你以为我会用循环移位法?查表法?
no no !!!
看看你手上的CPU,今天都2018年了,Intel 2008年 增加了SSE4.2指令集,其中就有硬件popcnt指令,就是用来求一个整数的二进制1位的个数。
公司的电脑,CPU还是i3不过可以看到已经是支持sse4指令集的。
马上看了一下GCC的支持情况,我手上的工作机上用的是GCC4.8 已经支持了。
可以用 _mm_popcnt_u64 这个函数,当然也有 _mm_popcnt_u32。
快速写了个C语言测试代码来体验一下。
编译:
Oops !出错了
别慌,gcc默认的编译开关没有打开sse4支持
指定cpu体系 -march=native ,可以看到 gcc 【enable】了sse4的支持。
可以看到输出了正确的计算结果 5。
查看生成的汇编代码也可以确认生成了正确的汇编指令 popcnt 。