&
,~
和==0
在此断言中的含义是什么?是说从类型变量中删除标签吗?我不熟悉C
和C++
种语言。只是通过阅读代码来学习。
答案 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
。
希望这可以帮助你理解这个想法!
更新:请参阅评论以获得整个表达式对程序员/用户/读者真正意义的简短回答