了解用于strlen优化的幻数0x07EFEFEFF

时间:2016-06-18 23:47:33

标签: c assembly bit-manipulation strlen

我偶然发现this answer关于使用用于strlen优化的幻数0x07EFEFEFF的问题,以下是最佳答案:

  

看看神奇的位。第16,24和31位为1.第8位为0.

     
      
  • 第8位表示第一个字节。如果第一个字节不为零,则此时第8位变为1。否则它是0
  •   
  • 第16位表示第二个字节。相同的逻辑。
  •   
  • 第24位代表第三个字节。
  •   
  • 第31位代表第四个字节。
  •   

但是,如果我使用result = ((a + magic) ^ ~a) & ~magic计算a = 0x100,我会发现result = 0x81010100,这意味着根据最高回答者,a的第二个字节等于0,显然是假的。

我错过了什么?

谢谢!

1 个答案:

答案 0 :(得分:4)

如果低位字节非零,这些位只告诉你一个字节是否为零 - 所以它只能告诉你第一个0字节,而不是第一个0之后的字节。

  • bit8 = 1表示第一个字节为零。其他字节,未知
  • bit8 = 0表示第一个字节为非零
  • bit8 = 0& bit16 = 1表示第二个字节为零,更高字节未知
  • bit8 = 0& bit16 = 0芒前两个字节非零。

此外,最后一位(bit31)仅告诉您最后一个字节的大约7位(并且仅当前3个字节非零时) - 如果它是唯一的位设置则最后一个字节为0或者128(其余为非零)。