>>
符号在Java中是位运算符之一。它表示右移操作,将一个数的二进制位向右移动指定的位数。
>>
符号在Java中是位运算符之一。它表示右移操作,将一个数的二进制位向右移动指定的位数。
>>
操作符是按位右移操作符。int i = 4;
System.out.println(i >> 1); // prints 2 - since shift right is equal to divide by 2
System.out.println(i << 1); // prints 8 - since shift left is equal to multiply by 2
负数的行为方式相同:
int i = -4;
System.out.println(i >> 1); // prints -2
System.out.println(i << 1); // prints -8
通常来说- i << k
相当于 i*(2^k)
,而 i >> k
则相当于 i/(2^k)
。
在所有情况下(就像任何其他算术运算符一样),您应该始终确保不会溢出数据类型。
它将位数向左移动...
这里有一些关于Java 运算符的信息。
例如:
101 = 5
Shifting out the right "1"
10 = 2
Shifting the other way...
1010 = 10
右移操作:
右移操作符 >> 将数值中的所有位向右移动指定次数。其一般形式为:value >> num。 这里,num 指定要将 value 中的值向右移动的位置数。也就是说,>> 将指定值中的所有位向右移动 num 指定的位数。 以下代码片段将值 32 向右移动两个位置,结果 a 被设置为 8:
int a = 32;
a = a >> 2; // a now contains 8
当一个值的位数被“移出”时,这些位数将会丢失。例如,下面的代码片段将值35向右移动两个位置,这会导致最低位的两个位数丢失,结果a被设为8。
int a = 35;
a = a >> 2; // a still contains 8
从二进制的角度看这个操作,更加清晰地展示了它的实现过程:
00100011 35 >> 2
00001000 8
–8 >> 1
是 –4
,在二进制中是:11111000 –8 >>1
11111100 –4
有趣的是,如果你向右移动-1位,结果总是保持为-1,因为符号扩展会在高位比特中带来更多的1。
有时候,在将值向右移动时,不希望对其进行符号扩展。例如,下面的程序将字节值转换为其十六进制字符串表示形式。请注意,移位后的值通过与0x0f相与进行掩码处理,以丢弃任何符号扩展位,使该值可以用作十六进制字符数组的索引。
// Masking sign extension.
class HexByte {
static public void main(String args[]) {
char hex[] = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
};
byte b = (byte) 0xf1;
System.out.println("b = 0x" + hex[(b >> 4) & 0x0f] + hex[b & 0x0f]);
}
}
b = 0xf1
我相信这是位移运算符。它将所有的 1 和 0 向右移动一位。(我想你可以想象出 << 做什么了...:))
正如其他人所指出的那样,这是正确的位移操作。在许多所谓的“C风格”语言中都可以看到它。
关于位移操作的大量详细信息,由你的StackOverflow用户提供,请查看我很久以前发布的一个问题,这个问题帮助我最终理解了它:位移操作的绝对初学者指南。(在那里发布的人非常友善地深入探讨了这个主题,我希望这也能帮助到你。)