Java Left Shift&右转

时间:2014-07-30 16:50:40

标签: java

这更像是一个澄清问题。假设我在int myvar中有一个值,其位表示为10000000000000000000000000000000.现在这是java中int的实际大小的32位(如果不能做出这个假设,请纠正我)。

现在问题是myvar<<的价值是什么? 1?它是000 ... 000因为' 1'在MSB中被移出?还有什么是myvar>> 1?它会是110000 .... 00000?

最后我们如何确定占用变量的位数?我的意思是我们在Java中有sizeOf(int)函数给我们32作为答案吗?感谢

3 个答案:

答案 0 :(得分:3)

  

假设我在int myvar中有一个值,其位表示为10000000000000000000000000000000 ....现在的问题是myvar的值是什么<< 1?它是000 ... 000因为' 1'在MSB中被移出?还有什么是myvar>> 1?它会是110000 .... 00000?

让我们找出

int myvar = Integer.MIN_VALUE;
System.out.println(Integer.toBinaryString(myvar));
System.out.println(Integer.toBinaryString(myvar << 1));
System.out.println(Integer.toBinaryString(myvar >> 1));

输出

10000000000000000000000000000000
0
11000000000000000000000000000000
  

我们在Java中有sizeOf(int)函数给我们32作为答案吗?

不完全是。但是包装类型中有SIZE字段,

System.out.println("Integer: " + Integer.SIZE);
System.out.println("Double: " + Double.SIZE);

输出

Integer: 32
Double: 64

答案 1 :(得分:2)

您对位移的理解是正确的。以下代码将确认。 对于Java中的sizeOf函数,所有整数占用32位。期。至于更一般的sizeOf函数,那么这是一个更复杂的主题,其他SO问题的答案。这就是说EHCache有一个相当不错的实现here

    int v1 = 1 << 31;
    int v2 = v1 << 1;
    int v3 = v1 >> 1;
    int v4 = v1 >>> 1;

    // -2147483648 is 10000000000000000000000000000000 and has 1 bits set
    System.out.println( v1 + " is " + Integer.toBinaryString(v1) + " and has "+Integer.bitCount(v1)+" bits set");    

    // 0 is 0 and has 0 bits set
    System.out.println( v2 + " is " + Integer.toBinaryString(v2) + " and has "+Integer.bitCount(v2)+" bits set");

    // -1073741824 is 11000000000000000000000000000000 and has 2 bits set    
    System.out.println( v3 + " is " + Integer.toBinaryString(v3) + " and has "+Integer.bitCount(v3)+" bits set");    

    // 1073741824 is 1000000000000000000000000000000 and has 1 bits set
    System.out.println( v4 + " is " + Integer.toBinaryString(v4) + " and has "+Integer.bitCount(v4)+" bits set");    

答案 2 :(得分:0)

int是32位签名因此第一位用于符号+/- 所以实际上只有31位决定了这个值。 请参考以下网址 http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

也是网址https://codereview.stackexchange.com/questions/58472/bitshift-code-compacting/58498#58498

有一个用于位移的工作代码 - 支持右/左位移。你可以从问题或答案中选择任何一个程序,用你想要转移的数字和你要转移的程度来运行......你可以立即得到答案......