Java表达式等价

时间:2015-09-08 20:17:32

标签: java bit-manipulation bitwise-operators

对于Java,如何:

long c = (long)a << 32 c+=b

相当于

CollectionBase

我理解的位掩码将返回原始数字本身,OR和加法操作不等效。那么这两个实现如何总是给出相同的答案呢?

4 个答案:

答案 0 :(得分:2)

如果操作数没有任何公共位,则按位OR等效于加法。

例如:

0x123456780000000 + 0x12345678 = 0x1234567812345678
0x123456780000000 | 0x12345678 = 0x1234567812345678

如果您只是将a 32位向左移动,则右侧将有32位零位。假设b只有32位,你可以安全地进行OR而不是添加。

答案 1 :(得分:1)

它们不等同(除非您限制b)的可能值。

例如,如果a == 1且b == -1,则第一个表达式将生成4563402751,第二个表达式将生成4294967295

如果您将b限制为&gt; = 0和&lt; = 0xFFFFFFF2^28 - 1),他们会得到相同的结果。

(long)a << 32(假设a的基本类型小于long)将a 32个位的位移到左侧。

因此a

                          xxx....xxxxxx

(长)a&lt;&lt; 32是

             xxx....xxxxxx000....000000 

现在,如果您在此数字与任何非负int之间执行按位OR,则会得到与添加这两个数字相同的结果,因为(long)a << 32的低32位为0,因此,在其低31位中仅添加1位的数字与在(long)a << 32中设置为1的所有位相同,并且在第二个数字中将所有位设置为1 (相当于按位OR)。

答案 2 :(得分:1)

让我们看一下这些位。

假设int是1字节(8位),long是2字节(16位)。

a << 32变为a << 80xFFFFFFFFL变为0xFFFFL

左侧部分((long)a << 8):

开始:

bits: 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
data: a a a a a a a a a a a a a a a a

转移a << 8

                      <-  shifted  ->
bits: 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
data: a a a a a a a a 0 0 0 0 0 0 0 0

右侧部分((long)b & 0xFFFFL)

开始:

bits: 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
data: b b b b b b b b b b b b b b b b

b & 0xFFFL之后:

      <- & with 0  -> <- & with 1  ->
bits: 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
data: 0 0 0 0 0 0 0 0 b b b b b b b b

现在|(请注意,ab没有&#34;触摸&#34;彼此!):

bits: 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
data: 0 0 0 0 0 0 0 0 b b b b b b b b

bits: 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
data: a a a a a a a a 0 0 0 0 0 0 0 0

给出:

bits: 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
data: a a a a a a a a b b b b b b b b

请注意,这可能仅适用于值的子集(尝试正数和负数),但其背后的逻辑正如我所述。

答案 3 :(得分:1)

((long)b & 0xFFFFFFFFL)b中提取最低有效32位。 ((long)a << 32)创建一个long,其中最低有效32位为0.这样,OR等同于+=

我不确定这是否也适用于b的负值,但是(二的补码)。

请注意,Java中的long有64位。