2

我遇到了这些位掩码结构,但想知道它们背后的逻辑

MASK_01010101 = ((unsigned int) (-1))/3
MASK_00110011 = ((unsigned int) (-1))/5
MASK_00001111 = ((unsigned int) (-1))/17

编辑:谢谢迈克尔。我编辑了最后一个

4

3 回答 3

2

多么美丽!但最后一个是错误的 ((unsigned int)(-1))/7 = b00100100!
对于那些对完整版 8 位掩码感兴趣的人,请参阅 codepad.org 上的此链接

于 2013-11-06T13:40:10.770 回答
1

如果您-1转换为无符号整数类型,它会环绕到该类型可以表示的最大(正)值。换句话说,所有的 1 都是二进制的。

当您考虑二进制形式时,每种情况下的除法运算可能会变得更加清晰:

  • 3 -> 11
  • 5 -> 101
  • 17 -> 10001

将所有 1 除以这些位模式会为您提供MASK_*名称中显示的模式之一。(unsigned int虽然通常超过 8 位,所以实际的模式会更长。)

于 2013-11-06T13:40:31.920 回答
0

作者在写这篇文章时并没有考虑清楚或效率。他们只是在炫耀或故意混淆代码。

于 2013-11-06T13:39:58.470 回答