如何在C中使用逆

时间:2011-06-28 15:03:28

标签: c bitwise-operators

[如何使用〜操作符]

我有一个结构说Alpha。我知道Alpha中的元素值(比如说a),可以是01 - 我希望相同结构的其他元素采用Alpha的反向值。一个。例如:

if Alpha.a = 1
then Alpha.b = 0

反之亦然

我试过了:

Alpha.b = ~ (Alpha.a)

但不幸的是它不起作用 - 当Alpha.a1时,Alpha.b设置为254

有什么想法吗?

谢谢和问候,

SamPrat

7 个答案:

答案 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.aunsigned char。然后~1将以二进制形式读取〜00000001,结果将是11111110(再次,二进制),这与十进制中的254和十六进制中的0xFE相同。

正如其他人所建议的那样,使用!Alpha.aAlpha.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

由于值为零或一,因此更简单。