逻辑 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 values:true
和false
。
C 语言将任何非 0
的标量值处理为 true
和 0
为 false
。
Logical NOT operator (!
) 将任何 true-ish 值(即不同于 0
)转换为 false
(即 0
)。
假设您可以使用算术运算符(加法、乘法、除法),您可以计算输入数字的每一位,使用逻辑非运算符更改其值然后 assemble 这些位返回一个数字那是输入数字的按位非。
例如,c
的最后一位是c % 2
,如果从数字中删除该位并移动其他位以填充其位置,则剩余的数字是c / 2
(或如您所知的 c >> 1
。)
我正在尝试使用逻辑运算符在 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 values:true
和false
。
C 语言将任何非 0
的标量值处理为 true
和 0
为 false
。
Logical NOT operator (!
) 将任何 true-ish 值(即不同于 0
)转换为 false
(即 0
)。
假设您可以使用算术运算符(加法、乘法、除法),您可以计算输入数字的每一位,使用逻辑非运算符更改其值然后 assemble 这些位返回一个数字那是输入数字的按位非。
例如,c
的最后一位是c % 2
,如果从数字中删除该位并移动其他位以填充其位置,则剩余的数字是c / 2
(或如您所知的 c >> 1
。)