对于Java,如何:
long c = (long)a << 32
c+=b
相当于
CollectionBase
我理解的位掩码将返回原始数字本身,OR和加法操作不等效。那么这两个实现如何总是给出相同的答案呢?
答案 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; = 0xFFFFFFF
(2^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 << 8
而0xFFFFFFFFL
变为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
现在|
(请注意,a
和b
没有&#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位。