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

Sam*_*uns 4 c assembly bit-manipulation strlen

我偶然发现了有关用于's 优化的幻数 0x07EFEFEFF 的利用的答案,以下strlen是最佳答案所说的内容:

看看魔法位。第 16、24 和 31 位为 1。第 8 位为 0。

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

不过,如果我计算result = ((a + magic) ^ ~a) & ~magica = 0x100,我发现result = 0x81010100,这意味着根据上面回答者,第二个字节a等于0,这显然是错误的。

我错过了什么?

谢谢!

Chr*_*odd 5

如果低字节不为零,这些位只会告诉您一个字节是否为零——因此它只能告诉您第一个 0 字节,而不能告诉您第一个 0 之后的字节。

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

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