如何在不必解包每个字段的情况下比较两个打包位域 - The Old New Thing

主要观点:讨论将多个位域打包进单个整数的情况,以及比较两个打包位域中对应字段大小的方法,包括解包位域、避免额外移位、插入零填充位和使用借位向量等方式,还提到了相关的参考资料和额外阅读内容。
关键信息:

  • 有 16 位整数打包了三个位域,如 r、g、b 位域,要比较两个打包位域 x 和 y 中对应字段的大小。
  • 一种方法是解包位域进行比较,如通过移位和按位与操作来获取各字段的值再比较。
  • 有优化方法可避免额外移位,直接按位与操作获取字段值再比较。
  • 插入零填充位可通过相减后查看填充位是否设置来判断是否有下溢,即比较两个 32 位整数。
  • 借助 Darek Mihocka 的借位向量技巧,通过特定公式计算借位向量并检查对应高位是否有借位来判断大小关系。
    重要细节:
  • 给出了使用借位向量判断的具体代码bool IsEveryComponentGreaterThanOrEqual(uint16_t x, uint16_t y) { auto c = ((~x & y) | (~(x ^ y) & (x - y)); c &= 0x8410; return c == 0; }
  • 提到相关参考资料如the paperthe presentationHow Bochs Works Under the Hood等。
  • 介绍了 Raymond Chen 参与 Windows 发展多年,其网站 The Old New Thing 很受欢迎且出了书,他偶尔在 Windows Dev Docs Twitter 账户上讲故事。
阅读 9
0 条评论