[如何使用〜操作符]
我有一个结构说Alpha
。我知道Alpha
中的元素值(比如说a
),可以是0
或1
- 我希望相同结构的其他元素采用Alpha的反向值。一个。例如:
if Alpha.a = 1
then Alpha.b = 0
反之亦然
我试过了:
Alpha.b = ~ (Alpha.a)
但不幸的是它不起作用 - 当Alpha.a
为1
时,Alpha.b
设置为254
有什么想法吗?
谢谢和问候,
SamPrat
答案 0 :(得分:40)
在C中,true
由1表示,false
由0表示。但是,在比较中,任何非假值都被视为真。
!
运算符执行布尔反转,因此!0为1且!1为0。
然而,~
运算符执行按位反转,其中值中的每个位都被反转。所以~0是0xffffffff(-1)。 ~1是0xfffffffe(-2)。 (并且-1和-2都被认为是真的,这可能让你感到困惑。)
您想要的是!
,而不是~
。
答案 1 :(得分:29)
使用XOR运算符:
Alpha.b = Alpha.a ^ 1;
答案 2 :(得分:3)
~
运算符否定每个位。例如,假设Alpha.a
是unsigned char
。然后~1
将以二进制形式读取〜00000001,结果将是11111110(再次,二进制),这与十进制中的254和十六进制中的0xFE相同。
正如其他人所建议的那样,使用!Alpha.a
或Alpha.a ^ 1
。
答案 3 :(得分:3)
针对这个常见问题的一个很好的跨平台跨语言解决方案是:
Alpha.b = 1 - Alpha.a;
答案 4 :(得分:1)
您无法使用~
,因为这会将00000000
变为11111111
而不是00000001
,因为我认为您正在期待。
如果你有bool,你可以使用:
Alpha.b = !(Alpha.a)
但如果没有,你可能必须使用if / else逻辑:
if (Alpha.a == 0)
{
Alpha.b = 1;
}
else
{
Alpha.b = 0;
}
答案 5 :(得分:1)
术后位掩码怎么样?
使用无符号字符寻找bit0:
b = 0x01u & ( ~a );
甚至
b = a ^ 0x01u;
或“布尔 - 思想家”(注意TRUE和FALSE可能与0/1不同!如果你想要它“真正的布尔”你应该使用TRUE和FALSE如果定义。)
b = (1 != a)?(0u):(1u);
干杯
答案 6 :(得分:0)
您想要使用其他运营商。具体来说!
Alpha.b = !Alpha.a
由于值为零或一,因此更简单。