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