求一个整数中的二进制1的位的个数

你以为我会用循环移位法?查表法?

no no !!!

看看你手上的CPU,今天都2018年了,Intel 2008年 增加了SSE4.2指令集,其中就有硬件popcnt指令,就是用来求一个整数的二进制1位的个数。

求一个整数中的二进制1的位的个数_第1张图片

公司的电脑,CPU还是i3不过可以看到已经是支持sse4指令集的。


马上看了一下GCC的支持情况,我手上的工作机上用的是GCC4.8 已经支持了。

求一个整数中的二进制1的位的个数_第2张图片

求一个整数中的二进制1的位的个数_第3张图片


可以用 _mm_popcnt_u64 这个函数,当然也有 _mm_popcnt_u32。


快速写了个C语言测试代码来体验一下。

求一个整数中的二进制1的位的个数_第4张图片


编译:

Oops !出错了


求一个整数中的二进制1的位的个数_第5张图片

别慌,gcc默认的编译开关没有打开sse4支持


求一个整数中的二进制1的位的个数_第6张图片

指定cpu体系 -march=native ,可以看到 gcc 【enable】了sse4的支持。

可以看到输出了正确的计算结果 5



求一个整数中的二进制1的位的个数_第7张图片

查看生成的汇编代码也可以确认生成了正确的汇编指令 popcnt 。




你可能感兴趣的:(解决问题,工作,C)