请详细解释x&(~0<< n)输出背后的逻辑

时间:2013-06-21 14:47:44

标签: bit-manipulation

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

2 个答案:

答案 0 :(得分:2)

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

例如,在8位,

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

将一个添加到11111111将换算为零 - 调用&#34;这个数字是这样的,这样就可以在其中添加一个导致零&#34;减去一个。

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

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

至于x & (~0 << n)~0只是表示所有人的一种方式&#34; (这也恰好是-1,这与这个用途无关)。对于大多数n,&#34;所有&#34;向左移动n是一堆后跟n零。

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

Java中的

a << n aint,相当于a << (n & 31)

答案 1 :(得分:0)

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

因此〜0是-1。

至于问题的其余部分:你究竟在问什么?