[英]~ 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。否则,它会产生 0。1 & 1 = 1、0 & 任何东西 = 0。
当 position 中的任何位为 1 时,按位 OR 产生 1,仅当 position 中的所有位为 0 时才产生 0。 1 | 0 = 1, 1 | 1 = 1, 0 | 0 = 0。
有符号数通常以二进制补码的形式完成(尽管处理器不必这样做。),请记住使用二进制补码。 当最高位 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.