C语言中逻辑非运算未返回预期值问题求助
用逻辑运算符在0xAA和0x55之间切换的问题解析
首先得帮你理清两个核心误解:
逻辑非
!不是逐位翻转:你以为!0xAA会得到0x55,这是把逻辑非和**位非~**搞混了。逻辑非是布尔层面的运算——它只判断整个值是否为0:只要输入是非零值(比如0xAA),!就会返回0;只有输入是0时,才返回1。所以unsigned char b = !c;得到0是完全正常的结果。>>是位运算符:你提到的c >> 1确实属于位操作,不符合你“只用逻辑运算符”的要求,这点你的怀疑是对的。
那如果必须只用逻辑运算符(!、&&、||)来实现0xAA和0x55的切换,该怎么做?
逻辑运算符本身只能返回布尔值(0或1),但我们可以结合逻辑运算符的短路特性,配合条件判断来实现切换:
unsigned char toggle(unsigned char c) { // 利用逻辑与的短路:当c是0xAA时,返回0x55;否则(c是0x55)返回0xAA return (c == 0xAA) && 0x55 || (c == 0x55) && 0xAA; }
这里的逻辑是:
- 如果
c == 0xAA为真,(c == 0xAA) && 0x55会直接返回0x55(逻辑与在第一个操作数为真时,返回第二个操作数的值),后面的||因为短路不会执行。 - 如果
c == 0xAA为假,就会执行后半部分(c == 0x55) && 0xAA,返回0xAA。
另外补充一点:如果允许使用位逻辑运算符(比如~、^),那实现起来更简单——c ^= 0xFF就能直接在0xAA和0x55之间切换(因为0xAA ^ 0xFF = 0x55,0x55 ^ 0xFF = 0xAA),但这属于位操作,不符合你当前的要求。
内容的提问来源于stack exchange,提问作者Lukali
相关产品推荐
相关产品推荐

