看csapp看到的一段不理解的C语言代码...
代码如下图所示 :
这是原书对它的解释, 但是我看了解释还是不太理解... 求大神帮忙解惑 ...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
代码如下图所示 :
这是原书对它的解释, 但是我看了解释还是不太理解... 求大神帮忙解惑 ...
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(1)
上面这段程序把
x
拆成8个char
存到数组vx
中并分别统计这8个char
中1的个数存放到val
数组中,再最后统计val
数组中8个数的和。我们可以发现
func_c1()
第8行开始的双重循环,其外循环每次的迭代是各自独立的,亦即如果我们有8个处理器同时进行 i = 0, i = 1, i = 2, ... i = 7 的处理也不会导致运算结果出错,因而这里就可以写成val
的8个字节同时加上vx
的8个字节对应字节的末位再将vx
的8个字节同时右移也是等效的。但是如果整体按照unsigned long
集体处理的话,要考虑到加法的进位问题和右移的“污染”问题(高位字节的数据会右移进低位字节),所幸:一、64位整数任意一段最多只有64个1,所以给定8位(1字节)的val[i]
无论怎么统计都不会溢出;二、由于实际上val[i]
是每次加上了vx[i]
的最低位,而且读取先于右移,所以合并成一个大的unsinged long
右移后虽然最后一次右移会使得x
的高字节的最低位占据低一个字节的最低位,但循环已经结束,x
的值已经没有意义了。最后第13行的统计,比起这样直接统计,假定我们有多个处理器的话,有一种并行统计的方法就是:
由于每一层统计之间互相不影响,所以我们也可以用
val[2 * i]
来存sum1[i]
,val[4 * i]
来存sum2[i]
,val[0]
来存sum
仍然不影响正确性。但是这样就可以把程序写得像原书fun_c()
最后的3个连加一样简洁高效了。当然最后返回第一个字节的值(fun_c1()
中是val[0]
而fun_c()
中是val & 0xFF
)作为结果。