首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >assert((df->type & ~(CT_OBSTACLE、CT_FLUID、CT_INTERFACE、CT_INTERFACE、CT_EMPTY)) == 0)

assert((df->type & ~(CT_OBSTACLE、CT_FLUID、CT_INTERFACE、CT_INTERFACE、CT_EMPTY)) == 0)
EN

Stack Overflow用户
提问于 2015-12-22 11:42:16
回答 3查看 57关注 0票数 2

在这个断言中,&~==0意味着什么?它是说从类型变量中删除标记吗?我不熟悉CC++语言。只是通过阅读代码来学习。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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等的位。最后的结果将与零进行比较。

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

票数 3
EN

Stack Overflow用户

发布于 2015-12-22 11:58:25

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

代码语言:javascript
复制
`&` is the bitwise AND operator.
`~` is the bitwise negation operator.

==是等于操作符(相等检查)。

通过查看您获得的掩码常量,断言的全部意义似乎是确保df->type没有设置4位掩码之外的任何内容。

票数 1
EN

Stack Overflow用户

发布于 2015-12-22 13:34:33

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

最好是以身作则,假设

代码语言:javascript
复制
#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一样。

因此,

代码语言:javascript
复制
CT_OBSTACLE | CT_FLUID | CT_INTERFACE | CT_EMPTY

会给你

代码语言:javascript
复制
0000 1000
0000 0100
0000 0010
0000 0001
--------- OR
0000 1111 = 0x0F

然后,bitwise-negation~,它在二进制表示中反转0和1。因此,

代码语言:javascript
复制
~(CT_OBSTACLE | CT_FLUID | CT_INTERFACE | CT_EMPTY)

会给你

代码语言:javascript
复制
0000 1111 //original
1111 0000 //inverted! = 0xf0

接下来,&被称为位-,它的概念类似于位-或,只不过现在使用的逻辑是

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

代码语言:javascript
复制
df->type & ~(CT_OBSTACLE | CT_FLUID | CT_INTERFACE | CT_EMPTY)

会给你

代码语言:javascript
复制
1111 0000 
1100 0011
--------- AND
1100 0000 = 0xC0

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

代码语言:javascript
复制
(df->type & ~(CT_OBSTACLE | CT_FLUID | CT_INTERFACE | CT_EMPTY)) == 0

将导致false,因为0xC0而不是等于0

希望这能帮你得到这个主意!

更新:请参阅注释,以获得整个表达式对程序员/用户/读者真正意义的简短答案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34415167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档