0

我对背后的逻辑有疑问x &(~0 <<n)
首先,我无法理解 的含义~0。当我在 Java 中尝试这个时,它显示-1. 我们如何-1用二进制表示并将其与正数区分开来?

4

2 回答 2

2

表示负数的最常见方式(也是 Java 使用的方式)称为Two's Complement。正如我在评论中提到的,在这个系统中计算负数的一种方法是-x = ~(x - 1). 另一种等效的方式是-x = ~x + 1.

例如,在 8bit 中,

 00000001  // 1
 00000000  // 1 - 1
 11111111  // ~(1 - 1) = ~0 = -1

加一11111111将归零 - 将“加一导致零的数字”称为减一是有意义的。

最高位设置的数字被视为负数。

我链接到的维基百科文章包含更多信息。

至于x & (~0 << n),~0只是表示“全1”的一种方式(也恰好是-1,这与此用途实际上无关)。对于大多数n,左移的“全1”n是一堆1,后跟n零。

总的来说,该表达式清除了 的n低位x。至少,对于0 <= n <= 31.

a << n在 Java 中,其中a,int等价于a << (n & 31).

于 2013-06-21T15:29:14.417 回答
0

字节0的每一位都是0,-1的每一位都是1,所以0的按位取反是-1。

因此〜0是-1。

至于剩下的问题:你到底在问什么?

于 2013-06-21T14:51:13.753 回答