在这个断言中,&、~和==0意味着什么?它是说从类型变量中删除标记吗?我不熟悉C和C++语言。只是通过阅读代码来学习。
发布于 2015-12-22 11:58:36
要将C代码翻译成英文,它的意思是“如果变量CT_OBSTACLE、CT_FLUID等中的任何位被设置为变量df->type,那么抛出一个断言”。
df->type是位域,CT_EMPTY等是位掩码。| (按位或)在这四位掩码中形成了一个新的临时位掩码。例如,如果它们是0x01、0x02、0x04、0x08,您将得到一个掩码0x0F。
然后,这个临时掩码与位补码运算符~进行倒置。所以如果掩码是0x0F,现在是0xF0。
最后,将位字段变量df->type与按位和&的掩码进行比较,以查看是否设置了任何比特。请注意,由于掩码是倒的,这将检查所有不是CT_OBSTACLE等的位。最后的结果将与零进行比较。
我想这是某种防御性的编程,以确保没有功能的比特不会被设置。
发布于 2015-12-22 11:58:25
&和~是两个不同的运算符:
`&` is the bitwise AND operator.
`~` is the bitwise negation operator.==是等于操作符(相等检查)。
通过查看您获得的掩码常量,断言的全部意义似乎是确保df->type没有设置4位掩码之外的任何内容。
发布于 2015-12-22 13:34:33
这是使用按位操作掩蔽的基础。为了理解这一点,您至少应该知道值的二进制表示。
最好是以身作则,假设
#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然后,bitwise-negation是~,它在二进制表示中反转0和1。因此,
~(CT_OBSTACLE | CT_FLUID | CT_INTERFACE | CT_EMPTY)会给你
0000 1111 //original
1111 0000 //inverted! = 0xf0接下来,&被称为位-,它的概念类似于位-或,只不过现在使用的逻辑是和。
因此,假设是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。
希望这能帮你得到这个主意!
更新:请参阅注释,以获得整个表达式对程序员/用户/读者真正意义的简短答案。
https://stackoverflow.com/questions/34415167
复制相似问题