C 有趣的位掩模形成

C 有趣的位掩模形成,c,bitmask,C,Bitmask,我遇到过这些比特面具,但不知道它们背后的逻辑 MASK_01010101 = ((unsigned int) (-1))/3 MASK_00110011 = ((unsigned int) (-1))/5 MASK_00001111 = ((unsigned int) (-1))/17 编辑:谢谢,迈克尔。我编辑了上一篇作者在写这篇文章时没有考虑清楚或效率。他们只是在炫耀或故意混淆代码。多么美好啊!但最后一个是错误的((unsigned int)-1))/7=b00100100! 对于那些对8

我遇到过这些比特面具,但不知道它们背后的逻辑

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

编辑:谢谢,迈克尔。我编辑了上一篇

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

多么美好啊!但最后一个是错误的((unsigned int)-1))/7=b00100100!

对于那些对8位掩码的完整版本感兴趣的人,请参见codepad.org。

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

当你考虑二进制形式:

时,每种情况下的划分操作可能会变得更清楚一些。
  • 3->11
  • 5->101
  • 17->10001

将所有1除以这些位模式,可以得到
掩码*
名称中显示的模式之一。(
unsigned int
通常大于8位,因此实际模式将更长。)

从阅读开始,然后您将了解
(unsigned int)-1
的功能。这些定义太可怕了!常数的名称已经具有位模式(例如
01010101
),它可能已经将其设置为
0x55
,而不是以非标准方式计算。不,它不是-它是b1001001。我想,
(-1))/17
就是我们想要的。谢谢评论!但1001也错了。它应该是MASK_00100100=((无符号整数)(-1)/7)。炫耀?真正地你的结论做出了粗略的假设。在不了解作者的情况下,假设是对这个问题唯一可能的回答。它本可以更容易地以可读的方式编写。如果提交人的意图是明确的,这个问题就没有必要了。