- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
c-c++经典代码实现
C、C++经典代码总结
2008年10月05日 星期日 15:57
下面是我收集的一些精妙的C代码和一些C++技巧。下面的代码可能需要我们做些调整才能够工作,因为我尽力保持代码实际执行更快,或者更紧凑。
除非我明确指出,否则所有变量都是无符号的32位整数。
倒转一个32位word的所有位
我在Linux fortune cookie代码中看到了如下的代码 (!)
n = ((n 1) 0 | ((n 1) 0xaaaaaaaa) ;
n = ((n 2) 0 | ((n 2) 0xcccccccc) ;
n = ((n 4) 0x0f0f0f0f) | ((n 4) 0xf0f0f0f0) ;
n = ((n 8) 0x00ff00ff) | ((n 8) 0xff00ff00) ;
n = ((n 16) 0x0000ffff) | ((n 16) 0xffff0000) ;
可以根据word的大小定制你自己的转换函数。
计算32位word中包含1的个数
John C. Wren把如下代码发给我。令人吃惊的是,它很象前一个技巧——位倒转。
n = (n 0 + ((n 0xaaaaaaaa) 1);
n = (n 0 + ((n 0xcccccccc) 2);
n = (n 0x0f0f0f0f) + ((n 0xf0f0f0f0) 4);
n = (n 0x00ff00ff) + ((n 0xff00ff00) 8);
n = (n 0x0000ffff) + ((n 0xffff0000) 16);
判断数n是否为2的幂
b = ((n(n-1))==0) ;
(注意:如果数n为2的幂,上述代码将b设置为真。在此语意下,0和1也被认为是2的幂)
上述代码通过将数n的最低有效‘1’位的值(least significant 1 bit )置为‘0’实现。如果数n是2的幂,那么,它只有一位是‘1’,经过运算后,n(n-1)为0,即b为真。
因此,上述表达式中间的那部分也是一个小技巧……
最低有效‘1’位置0
n(n-1)
最低有效n位置为1
~(~0n)
交换两个整数的值
这段代码的精妙就在于,它没有使用临时变量,并且相对于普通的方法不容易出错。这个方法已经流传了好多年了,所以我并不知道是谁发明了这个方法。
x = x ^ y ;
y = x ^ y ;
x = x ^ y ;
(操作符‘^’代表C/C++语言中的位运算符——异或,而不是人们所想的ex-FORTRAN语言中的幂运算符)
然而,Scott Smith指出,下面这种更为优雅的写法和上面是等价的:
x ^= y ^= x ^= y ;
因为同样的变量在一个语句中被改变两次,上面的语句是不符合C++语法的。
转换数字为ASCII的16进制表示
另一段古老的代码。我第一次见到此段代码是在vi的代码中,但是,它或许比那还要早很多。
0123456789ABCDEF [ n ]
(n的范围: 0..15)
我也见过如下表示法:
n [ 0123456789ABCDEF ]
如果变量n为字符变量,并且你关闭了足够多的编译错误检查开关,上述代码即可工作。
转换所有非零值为1
Pat Down发送这段代码给我:
b = !!a ;
如果a为0,则b为0,否则b为1。
小端序还是大端序?
一些计算机存储整数的最重要字节(MSB)在最前面,而后是次重要字节(LSB),另外一些计算机则采用了相反的方法。前面的那种形式我们称之为大端序(big-endian),后面的叫小端序(little-endian)。Intel的计算机均采用了小端序,其余的采用了大端序。
大多数人们并没有意识到术语大端序和小端序是来自小说《格利佛游记》(Gullivers Travels)。两个国家Lilliput和 Blefuscu 由于争论煮熟的鸡蛋到底是应该从哪头打开而发生了一起可怕、血腥的战争,这即是大端序和小端序的由来。
CPU制造厂商之间的争论同样无聊,而且还有着一些损害。
格利佛说道:“...all true Believers shall break their Eggs at the convenient End: and which is the convenient End, seems, in my humble Opinion, to be left to every Mans Conscience, or at leas
文档评论(0)