Java - 按位比较和位移位

时间:2012-10-04 12:40:33

标签: java bit-manipulation

我需要对以下陈述做一点解释,它在做什么?:

int result = 154 + (153 << 8) + (25 << 16) + (64 << 24);
/* what would be the value of result after this line and how it is calculated
Why we need this? */

3 个答案:

答案 0 :(得分:4)

(153 << 8) 相当于 153 * pow(2, 8)

你实际上是把你的位向左移......

另外: -

(153 >> 8) 相当于 153 / pow(2, 8)

你可以猜到为什么..这实际上是将位向右移......

E.G: -

3 => 0011

3 << 2 is equal to 1100 -> (Which is code for 12)

3 >> 2 is equal to 0000 -> (Which is code for 0) -> you can see - **(3 / 4 = 0)**

注意: - 请注意right shifting rounds off towards negative infinity ..

对于E.G: -

-3 >> 1 --> -2 (-1.5 is rounded to -2)

让我们看看它是如何发生的: -

在二进制字符串表示中: -

-3 ==> 11111111111111111111111111111101

-3 >> 1 ==> 11111111111111111111111111111110 (-3 / 2 = -1.5 -> rounded to -2)

(注意最左边的位由移位前最左端的位填充(在这种情况下为1))

因此,值变为 -2 (对于-3>&gt;> 1,大于-3) 负数会发生这种情况.. Right shifting a negative number gives a number greater than the original number..

0填充最左边位的正数相反...因此value obtained will be less than the original..

3 ==>  00000000000000000000000000000011

3 >> 1 ==> 00000000000000000000000000000001 (3 / 2 = 1.5 -> rounded to 1)

(因此,大多数位保持为0.因此,该值为1(小于3),即,值向负无穷大四舍五入,从1.5变为1)

同样,您可以设计left-shifting正数和负数的结果。

答案 1 :(得分:2)

答案是1075419546.左移运算符基本上是在十进制数的二进制表示中加0,所以这只是

154 + 153 * 2 ^ 8 + 25 * 2 ^ 16 + 64 * 2 ^ 24

所以你可以将153转换为二进制表示,然后添加8个零并转换回十进制等等。

答案 2 :(得分:0)

实际上,如果在数学表达式上使用给定运算符,则其含义与以下内容相同:

123&lt;&lt; n与123 * 2 ^ n

完全相同

例如,2&lt;&lt; 2是2 * 2 ^ 2,其为8或与1000相同

否则,您只是将位移到左侧:

3 = 11然后3 <&lt;&lt; 2 = 1100。

希望它能说清楚。