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) & ~magic
用a = 0x100
,我发现result = 0x81010100
,这意味着根据上面回答者,第二个字节a
等于0,这显然是错误的。
我错过了什么?
谢谢!
如果低字节不为零,这些位只会告诉您一个字节是否为零——因此它只能告诉您第一个 0 字节,而不能告诉您第一个 0 之后的字节。
此外,最后一位 (bit31) 仅告诉您最后一个字节的大约 7 位(并且仅当前 3 个字节非零时)——如果它是唯一设置的位,则最后一个字节是 0 或 128(并且其余的都是非零)。