我怀疑x &(~0 <<n)
背后的逻辑
首先,我无法理解~0
的含义。当我在Java中尝试这个时,它显示-1
。怎么样
我们可以用二进制表示-1
并将其与正数区分开来吗?
答案 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
。
a << n
a
为int
,相当于a << (n & 31)
。
答案 1 :(得分:0)
字节0的每一位都是0,-1的每一位都是1,所以0的按位取反是-1。
因此〜0是-1。
至于问题的其余部分:你究竟在问什么?