这更像是一个澄清问题。假设我在int myvar中有一个值,其位表示为10000000000000000000000000000000.现在这是java中int的实际大小的32位(如果不能做出这个假设,请纠正我)。
现在问题是myvar<<的价值是什么? 1?它是000 ... 000因为' 1'在MSB中被移出?还有什么是myvar>> 1?它会是110000 .... 00000?
最后我们如何确定占用变量的位数?我的意思是我们在Java中有sizeOf(int)函数给我们32作为答案吗?感谢
答案 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
有一个用于位移的工作代码 - 支持右/左位移。你可以从问题或答案中选择任何一个程序,用你想要转移的数字和你要转移的程度来运行......你可以立即得到答案......