断言((df-> type&〜(CT_OBSTACLE | CT_FLUID | CT_INTERFACE | CT_EMPTY))== 0)

时间:2015-12-22 11:42:17

标签: c

&~==0在此断言中的含义是什么?是说从类型变量中删除标签吗?我不熟悉CC++种语言。只是通过阅读代码来学习。

3 个答案:

答案 0 :(得分:3)

要将C代码翻译成英文,这意味着"如果CT_OBSTACLE,CT_FLUID等之一的任何位都设置在变量df->type中,则抛出一个断言"

df->type是一个位字段,CT_EMPTY等是位掩码。 |(按位OR)从这四个位掩码中形成一个新的临时位掩码。例如,如果它们是0x01,0x02,0x04,0x08,则会得到掩码0x0F。

然后使用按位补码运算符~反转此临时掩码。因此,如果掩码为0x0F,则现在为0xF0。

最后,将位字段变量df->type与按位AND &的掩码进行比较,以查看是否设置了任何位。请注意,由于掩码被反转,因此会检查所有不是CT_OBSTACLE等的位。最终结果将与零进行比较。

我猜这是某种防御性编程,以确保没有功能的位不被设置。

答案 1 :(得分:1)

&~是两个不同的运算符:

`&` is the bitwise AND operator.
`~` is the bitwise negation operator.

==等于运算符(等式检查)。

通过查看那些掩码常量,看来断言的全部意义是确保df->type没有设置4位掩码以外的任何东西。

答案 2 :(得分:1)

这是使用按位操作进行屏蔽的基础。为了理解这一点,你至少应该知道值的二进制表示

最好是通过示例来展示概念,假设

#define CT_OBSTACLE  0x08 //binary representation: 0000 1000
#define CT_FLUID     0x04 //binary representation: 0000 0100
#define CT_INTERFACE 0x02 //binary representation: 0000 0010
#define CT_EMPTY     0x01 //binary representation: 0000 0001

然后|被称为按位 - 或。它看到二进制表示中的逻辑就像数学布尔逻辑中的OR那样。

因此,

CT_OBSTACLE | CT_FLUID | CT_INTERFACE | CT_EMPTY

会给你

0000 1000
0000 0100
0000 0010
0000 0001
--------- OR
0000 1111 = 0x0F

然后~ 按位否定它在二进制表示中反转0和1。因此,

~(CT_OBSTACLE | CT_FLUID | CT_INTERFACE | CT_EMPTY)

会给你

0000 1111 //original
1111 0000 //inverted! = 0xf0

接下来,&被称为按位 - 它与按位 - 或的概念类似,不同之处在于现在使用的逻辑是 AND

因此,假设dt->type = 0xC3 = 1100 0011 (in binary),那么

df->type & ~(CT_OBSTACLE | CT_FLUID | CT_INTERFACE | CT_EMPTY)

会给你

1111 0000 
1100 0011
--------- AND
1100 0000 = 0xC0

最后,==只是相等比较器,与=形成对比,称为赋值==是比较左侧的值是否等于右侧的值。在C.中,如果为真,则结果为1,如果为假,则结果为0。所以使用这个例子,

(df->type & ~(CT_OBSTACLE | CT_FLUID | CT_INTERFACE | CT_EMPTY)) == 0

将导致false,因为0xC0 等于0

希望这可以帮助你理解这个想法!

更新:请参阅评论以获得整个表达式对程序员/用户/读者真正意义的简短回答