算法程序员C语言

C语言程序员编程学习—如何快速的计算一个二进制数中1的个数

2018-03-21  本文已影响49人  小辰带你看世界

C语言是面向过程的,而C++是面向对象的

C和C++的区别:

C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。

C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。 所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”。

C与C++的最大区别:在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”,而就语言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,“C加上好的设计”也能写出非常好的东西。

给定一个数 x,如何能够快速的计算其二进制中1的个数 OneNum?

小编推荐一个学C语言/C++的学习裙【 六九九,四七零,五九六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

有个笨办法,就是逐比特逐比特的遍历其二进制。

while( x != 0)

{

OneNum += (x & 0x1) ;//判断最右一位是否为1,是的话加个数加1

x = x >> 1; //x 右移(确保使用逻辑右移,非算术右移)一位

}

开销如下:至少发生一次分支跳转。还有 n 次>>,+,&运算,其中n为从右数(从1开始数),最高位为1的位置。

小编推荐一个学C语言/C++的学习裙【 六九九,四七零,五九六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

还有个方法,类似于二分法,每次计算上次计算2倍的比特数。

/*假设x为64位无符号数*/

x = (x & 0x5555555555555555) + ((x >>1) & 0x5555555555555555);

x= (x & 0x3333333333333333) + ((x >>2) & 0x3333333333333333);

x= (x & 0x0f0f0f0f0f0f0f0f) + ((x >>4) & 0x0f0f0f0f0f0f0f0f);

x= (x & 0x00ff00ff00ff00ff) + ((x >>8) & 0x00ff00ff00ff00ff);

x= (x & 0x0000ffff0000ffff) + ((x >>16) & 0x0000ffff0000ffff);

x= (x & 0x00000000ffffffff) + ((x >>32) & 0x00000000ffffffff);

一共需要 6 * 4 (2个&,1个+, 1个>> )个操作。思想就是先计算每相邻2位的比特为1的个数,然后计算每相邻4位,比特为1的个数,然后计算每相邻8位,比特为1的个数。。。直到最后,每相邻64位,比特为1的个数,即是最后所求。

小编推荐一个学C语言/C++的学习裙【 六九九,四七零,五九六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

两种方法各有优劣,主要看传入数据的类型和特征,以及分支预测失败的开销。具体可以编程序试下。对于那种非常混乱,没有规律的数据,推荐使用第二种,运行速度会更快。

这些是C/C++能做的

服务器开发工程师、人工智能、云计算工程师、信息安全(黑客反黑客)、大数据 、数据平台、嵌入式工程师、流媒体服务器、数据控解、图像处理、音频视频开发工程师、游戏服务器、分布式系统、游戏辅助等

上一篇下一篇

猜你喜欢

热点阅读