我试图使用逻辑运算符在0xAA和0x55之间切换。
我知道我可以使用ng new ng-magnific-popup
从0xAA更改为0x55,但是我被要求使用逻辑运算符,而不是按位运算符,所以我不知道是否计算使用>>运营商...
但我对使用NOT逻辑操作感到有点困惑。
我确信如果我说
npm install --save jquery magnific-popup
然后b将是0x55。相反,我的输出为0.不应该将每个位切换到相反的位置,给我0x55?
感谢您的帮助。
答案 0 :(得分:2)
相反,我的输出为0。
logical operators与boolean values合作:true
和false
。
C语言处理的任何标量值都不是0
true
和0
false
。
Logical 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
,因为它会反转每个位。