【问题标题】:Understanding the magic number 0x07EFEFEFF used for strlen optimization了解用于 strlen 优化的幻数 0x07EFEFEFF
【发布时间】:2016-06-18 23:47:32
【问题描述】:

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

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

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

但是,如果我用a = 0x100计算result = ((a + magic) ^ ~a) & ~magic,我发现result = 0x81010100,意思是根据top answerer,a的第二个字节等于0,这显然是错误的。

我错过了什么?

谢谢!

【问题讨论】:

  • 我不相信结果实际上会告诉您哪个字节为零。它只会告诉您是否至少有一个字节为零。

标签: c assembly bit-manipulation strlen


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2023-02-02
    • 2016-07-23
    • 2018-01-19
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多