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

Logical NOT operation not returning expected value in c?

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

我知道我可以使用 c >> 1 从 0xAA 更改为 0x55,但我被要求使用逻辑运算符而不是按位运算符来执行此操作,所以我不知道是否应该使用 >> 运算符...

但是我对使用NOT逻辑运算有点困惑。

我确定如果我说

unsigned char c = 0xAA;
unsigned char b = !c;

那么b就是0x55。相反,我得到了 0 的输出。它不应该将每个单独的位切换到相反的位置,给我 0x55 吗?

感谢您的帮助。

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

第一行:

c = 0xAA; 

当第二行

时被视为'true'
b = !c;

被执行,并且 not true 为 false 所以 b 被设置为 false I.E. 0

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

I am trying to switch between 0xAA and 0x55 with the use of logical operators.

这是一项艰巨的任务。使用逻辑运算符的表达式的计算结果为 true/false。祝你项目顺利。

关于

Then b would be 0x55. Instead I got an output of 0. Shouldn't it switch every individual bit to its opposite, giving me 0x55?

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

,则计算结果为 1

I am trying to switch between 0xAA and 0x55 with the use of logical operators.

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

如您所说,! 是逻辑 NOT 运算符。它采用 "true" 值和 returns "false" 或 "false" 值和 returns "true"。请注意,它会反转 整个值 ,而不是单个位。在 C 中,0 被认为是 "false",任何 non-zero 数值都被认为是 "true"。所以 !0xAA 计算为 0 因为 0xAA 是 "true" 而 0 是 "false".

将此与 ~ 进行对比,后者是按位非运算符。 ~0xAA 将如您所料计算为 0x55,因为它会反转每个单独的位。

如果您真的必须只使用 ! 而不是 ~ 来做到这一点,我想到了一个可怕的 hack。因为这是家庭作业,所以我不会向您展示整个 hack,只是其中的一部分:

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 编译器,现在大多数(但不是全部)都是这样,可以翻转一个字节中的所有单个位,使用只有 =! 运算符。

Instead I got an output of 0.

logical operators work with boolean valuestruefalse

C 语言将任何非 0 的标量值处理为 true0falseLogical NOT operator (!) 将任何 true-ish 值(即不同于 0)转换为 false(即 0)。


假设您可以使用算术运算符(加法、乘法、除法),您可以计算输入数字的每一位,使用逻辑非运算符更改其值然后 assemble 这些位返回一个数字那是输入数字的按位非。

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