这更像是一个澄清问题。假设我在int myvar中有一个值,其位表示为10000000000000000000000000000000。现在这是32位的int在java中的实际大小(请纠正我,如果这个假设不能做出)。
现在的问题是myvar <<1 ?是1000…000是因为MSB中的"1"被移出了吗?myvar>> 1是什么?会是110000....00000吗?
最后,我们如何确定占用一个变量的位数?我的意思是,在Java中我们有sizeOf(int)函数给出32作为答案吗?由于
假设我在int myvar中有一个值,其位表示为10000000000000000000000000000000....现在的问题是myvar <<1 ?是1000…000是因为MSB中的"1"被移出了吗?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
我们有sizeOf(int)函数在Java中给我们32作为答案吗?
不完全是。但是在包装器类型中有SIZE字段
System.out.println("Integer: " + Integer.SIZE);
System.out.println("Double: " + Double.SIZE);
输出Integer: 32
Double: 64
您对位移位的理解是正确的。下面的代码将对此进行确认。对于Java中的sizeOf函数,所有int型都占用32位。时期。至于更一般的sizeOf函数,这是一个比其他SO问题更复杂的问题。这就是说EHCache在这里有一个相当不错的实现。
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");
int是32位有符号的,因此第一个位用于符号+/-所以实际上只有31位决定了它的值。请参考以下网址http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
also URL https://codereview.stackexchange.com/questions/58472/bitshift-code-compacting/58498#58498
有一个用于位移位的工作代码-支持右/左位移位。你可以从问题或答案中选择任何一个程序,用你想要移动的数字和你想要移动的程度来运行它……你可以立即得到答案…