逻辑NOT操作没有返回c中的预期值?

时间:2018-03-23 16:17:31

标签: c bitwise-operators logical-operators

我试图使用逻辑运算符在0xAA和0x55之间切换。

我知道我可以使用ng new ng-magnific-popup从0xAA更改为0x55,但是我被要求使用逻辑运算符,而不是按位运算符,所以我不知道是否计算使用>>运营商...

但我对使用NOT逻辑操作感到有点困惑。

我确信如果我说

npm install --save jquery magnific-popup

然后b将是0x55。相反,我的输出为0.不应该将每个位切换到相反的位置,给我0x55?

感谢您的帮助。

6 个答案:

答案 0 :(得分:2)

  

相反,我的输出为0。

logical operatorsboolean values合作:truefalse

C语言处理的任何标量值都不是0 true0 falseLogical NOT operator (!)将任何真实值(即不同于0)转换为false(即0)。

假设您可以使用算术运算符(加法,乘法,除法),您可以计算输入数字的每个位,使用逻辑NOT运算符更改其值,然后将这些位重新组合成一个数字,即Bitwise NOT of输入数字。

例如,c的最后一位是c % 2,如果从该数字中删除该位并且其他位被移位以填充其位置,那么该数字为c / 2 (或c >> 1,如您所知。)

答案 1 :(得分:1)

正如@ Code-Apprentice所说,!因为你在做数学而不是逻辑而不是正确的算子。但是,你的问题表明你想要使用逻辑运算符,因此〜运算符是不够的,因为它不是逻辑运算符。想一想逻辑和数学运算之间的区别。逻辑运算不执行算术运算,它们对布尔运算。那么你将如何使用逻辑NOT,AND,OR,XOR等来完成你的任务呢?您甚至可以先用铅笔和纸手动执行此操作(提示:将十六进制值转换为二进制值)

答案 2 :(得分:1)

  

我试图使用逻辑运算符在0xAA和0x55之间切换。

这是一项艰巨的任务。使用逻辑运算符的表达式求值为true / false。祝你好运。

关于

  

然后b将是0x55。相反,我的输出为0.不应该将每个位切换到相反的位置,给我0x55?

这不是逻辑运算符!的作用。如果其操作数不为零,则计算结果为0;如果其操作数为1,则计算结果为0

答案 3 :(得分:1)

如果你真的必须只使用!而不是~,我会想到一个可怕的黑客。因为这是作业,我不会向你展示整个黑客,只是它的一部分:

static_assert(CHAR_BIT == 8, "What is this, a PDP-10?");

union {
  uint8_t val;
  struct {
    uint8_t b0 : 1;
    uint8_t b1 : 1;
    uint8_t b2 : 1;
    uint8_t b3 : 1;
    uint8_t b4 : 1;
    uint8_t b5 : 1;
    uint8_t b6 : 1;
    uint8_t b7 : 1;
  } bits;
} u;

我向你保证,通过这个变量声明和一个符合C99 +勘误表的C编译器,现在大多数(但不是全部)都可以,只使用一个字节翻转一个字节中的所有单个位。 =!运营商。

答案 4 :(得分:0)

第一行:

c = 0xAA; 
当第二行

时,

被视为'真'

b = !c;

已执行,not true为false,因此b设置为false。{E} 0

需要注意的一点是:逐位运算符与逻辑运算符不同。 !是一个逻辑运算符

答案 5 :(得分:0)

  

我试图使用逻辑运算符在0xAA和0x55之间切换。

这是不可能的,因为逻辑运算符不能以这种方式工作。相反,您需要使用按位运算符。

正如您所说,!是逻辑NOT运算符。它采用“true”值并返回“false”或“false”值并返回“true”。请注意,它会反转整个值,而不是单个位。在C中,0被认为是“假”,任何非零数值都被认为是“真”。因此!0xAA评估为0因为0xAA为“true”而0为“false”。

将此与~(按位NOT运算符)进行对比。 ~0xAA将按照您的预期评估为0x55,因为它会反转每个位。