C中的逻辑运算符和位操作

时间:2014-05-10 18:02:45

标签: c++ c computer-science logical-operators

我正在尝试做一些练习,但我仍然坚持这一点,在那里我无法理解发生了什么,并且无法找到与此特定事项有关的任何事情(找到关于逻辑运算符的其他内容,但仍然不够)

编辑:为什么downvote,我很明确。没有关于X的类型的信息,但我假设是INT,大小也没有描述,我想我会发现通过练习。

a) At least one bit of x is '1';
b) At least one bit of x is '0';
c) At least one bit at the Least Significant Byte of x , is '1';
d) At least one bit at the Least Significant Byte of x , is '0';

我有解决方案,但理解它们会很棒

a) !!x  // What happens here? The '!' Usually is NOT in c

b) !!~x // Again, the '!' appears... The bitwise operand NOT is '~' and it makes the int one's complement, no further realization made unfortunately 

c) !!(x & 0xFF) // I've read that this is a bit mask, i think they take in consideration 4 bytes in X, and this applies a mask at the least significant byte?

d) !!(~x & 0xFF) // Well, at this point i'm lost ...

我希望不要在大学上课,但我全职工作以支付费用:(。

2 个答案:

答案 0 :(得分:3)

您可以在单独的操作周围添加括号并按顺序应用它们。 e.g。

!(!(~x))

即。 !是2不是

如果你执行一个NOT,那么某些值会发生什么:

如果x == 0!x == 1,否则!x == 0

因此,如果您要执行另一个NOT,则会再次反转真值。即。

如果x == 0!!x == 0,否则!!x == 1

你可以看到它在0和1之间取值,其中0表示:“没有x的位是'1'”,1表示:“至少有一位x是'1'”。

此外,x & 0xFF获取变量的最低有效字节。这里有更全面的解释:

What does least significant byte mean?

答案 1 :(得分:1)

假设x是某个unsigned int/short/long / ...并且您想要条件(如果,而......):

a)你必须知道只有一个值/变量作为条件(没有a==b或其他)
如果是false,则为0;如果不是0则为{}。因此,如果x不是0true),则一个!会将其切换为0而将另一个!切换为非{ 0再次(不一定是旧值,只是不是0)。如果x0!最终会再次0(首先不是0,而是0)。
如果至少1位为1,则x的整个值不是0

您正在做的是将0或0或1位的值转换为1位的某个值。没错,但是......你可以写if(x)而不是if(!!x)

b)~将每个0 - 位切换为1,将每1切换为0。现在,您可以再次搜索1,因为您希望原始值中包含0。同样的!! - 再次......

c和d:
&0xFF将除最低8个(最低字节)之外的所有位设置为0 A&B的结果是一个值,如果同一位置的A和B的位都是1,则每个位仅为10xff(十进制255)是设置为1的最低8位的数字......