繁体   English   中英

~ 一元运算符和按位测试给出否定结果

[英]~ Unary Operator and Bitwise Tests Give Negative Results

我正在研究按位运算符,直到一元 ~one 的补码与它们一起使用,它们才有意义。 谁能向我解释这是如何工作的?

例如,这些是有意义的,但是除这些之外的计算的 rest 没有:

1&~0 = 1   (~0 is 1 -> 1&1 = 1)
~0^~0 = 0  (~0 is 1 -> 1^1 = 0)
~1^0 = 1   (~1 is 0 -> 0^1 = 1)
~0&1 = 1   (~0 is 1 -> 1&1 = 1)
~0^~1 = 1  (~0 is 1, ~1 is 0 -> 1^0 = 1)
~1^~1 = 0  (~1 is 0 -> 0^0)

产生的结果的 rest 为负数(如果无符号,则为一个非常大的数字)或与我所知道的逻辑相矛盾。 例如:

0&~1 = 0   (~1 = 0 therefor 0&0 should equal 0 but they equal 1)
~0&~1 = -2
~1|~0 = -1

等等。你可以指点我了解这个吗?

当您将它们扩展一点时,它们实际上确实有意义。 不过有几点需要注意:

  1. 仅当涉及的两个位都是 1 时,按位与才会产生 1。否则,它会产生 0。1 & 1 = 1、0 & 任何东西 = 0。

  2. 当 position 中的任何位为 1 时,按位 OR 产生 1,仅当 position 中的所有位为 0 时才产生 0。 1 | 0 = 1, 1 | 1 = 1, 0 | 0 = 0。

  3. 有符号数通常以二进制补码的形式完成(尽管处理器不必这样做。),请记住使用二进制补码。 当最高位 position 为 1 时,您反转并加 1 以获得幅度。

假设是 32 位 integer,您会得到以下结果:

 0 & ~1 = 0 & 0xFFFFFFFE = 0
~0 & ~1 = 0xFFFFFFFF & 0xFFFFFFFE = 0xFFFFFFFE (0x00000001 + 1) = -2
~1 | ~0 = 0xFFFFFFFE & 0xFFFFFFFF = 0xFFFFFFFF (0x00000000 + 1) = -1

~1 = 0 - 不,不是。 它等于-2 让我们以一个八位二补码为例。 十进制数1具有表示0000 0001 所以~1将有1111 1110这是-2的两个补码表示。

0&~1 = 0 ( ~1 = 0因此0&0应该等于0但它们等于1 )

~1等于-2 如果翻转二进制补码数的所有位,则将其乘以-1并从结果中减去1 不管0对于所有位都有0 ,所以&的结果无论如何都会是0

~0&~1 = -2

~0已设置所有位,因此~0&~1只是~1 这是-2

~1|~0 = -1

~0已设置所有位,因此|的结果~0 (= -1 ),无论它与什么进行或运算。

为简单起见,只需扩展至 8 位,

1 = 0000 0001

你假设,

1 = 1111 1111 // which is wrong

1111 1111 ,将是最大可能的数字。

如果您希望每个位都设置为1 ,您需要执行以下操作:

(-1)

或者

~0

还要小心你使用的类型,比如你可能想做 64 位的操作,但它只能扩展到 32 位。 在这种情况下,您需要进行类型转换。

例如:

uint64_t a = 1 << 63;

如果1扩展为 32 位,则结果为 0,但您将其移动了 63。

因此,为了纠正这一点,

uint64_t a = 1ULL << 63;

或者

uint64_t a = (uint64_t)1 << 63;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM