让我们尝试一下countmore 的直觉。
首先,~0UL/255*(127-n) 是一种巧妙的方法,可以将值127-n 并行复制到字中的所有字节。为什么它有效? ~0 在所有字节中为 255。因此,~0/255 在所有字节中都是1。乘以(127-n) 就是开头提到的“复制”。
术语~0UL/255*127 只是上述n 为零的特例。它将 127 复制到所有字节中。如果单词是 4 个字节,那就是 0x7f7f7f7f。与x 的“Anding”将每个字节中的高位清零。
这是第一个词(x)&~0UL/255*127)。结果与x 相同,只是每个字节中的高位为零。
第二项~0UL/255*(127-(n))如上:127-n复制到每个字节。
对于任何给定的字节x[i],如果x[i]<=127,将这两个项相加得到127-n+x[i]。每当x[i]>n 时,此数量都会设置高位。最容易将其视为添加两个 7 位无符号数。结果“溢出”到第 8 位,因为结果为 128 或更多。
所以看起来该算法将使用每个字节的第 8 位作为指示 x[i]>n 的布尔值。
那么其他情况呢,x[i]>127?这里我们知道字节大于n,因为算法规定n<=127。第 8 位应该始终为 1。令人高兴的是,和的第 8 位无关紧要,因为下一步“或”是x 的结果。由于x[i] 将第 8 位设置为 1 当且仅当它为 128 或更大时,此操作仅在总和可能提供错误值时“强制”第 8 位为 1。
总结到目前为止,当且仅当x[i]>n 时,“或”结果的第 i 个字节中的第 8 位设置为 1。不错。
下一个操作&~0UL/255*128 将所有内容设置为零,除了所有感兴趣的第 8 位。这是与 0x80808080 的“与”...
现在的任务是找出这些被设置为 1 的位数。为此,countmore 使用了一些基本的数论。首先它右移 7 位,所以感兴趣的位是 b0、b8、b16... 这个字的值是
b0 + b8*2^8 + b16*2^16 + ...
一个美丽的事实是 1 == 2^8 == 2^16 == ... mod 255。换句话说,每个 1 位是 1 mod 255。因此找到移位结果的 mod 255 是等同于求和 b0+b8+b16+...
哎呀。我们完成了。