在Java中双倍大于符号(>>)?

Java中的>>符号是什么意思? 我从来没有见过它用过,但今天遇到它。 我试图在Google上search,但没有发现任何有用的东西。

这是移位运算符。 文档

带符号的左移运算符“<<”将位模式向左移位,并且带符号的右移运算符“>>”将位模式向右移位。 位模式由左侧操作数给出,位数由右侧操作数进行移位。 无符号右移运算符“>>>”将零移动到最左边的位置,而“>>”之后的最左边位置取决于符号的扩展。

>>运算符是按位右移运算符。

简单的例子:

 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 

负数performance相同:

 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)

在任何情况下(就像其他算术运算符一样),您应该始终确保不会溢出数据types。

它移动位…

inheritance人一些信息在Java运营商

例如

 101 = 5 Shifting out the right "1" 10 = 2 Shifting the other way... 1010 = 10 

右派:

右移操作符>>将值中的所有位向右移动指定的次数。 它的一般forms是:value >> num这里,num指定将值的值右移的位置数。 也就是说,>>将指定值中的所有位向右移动num指定的位数。 下面的代码片段将值32向右移动两个位置,结果被设置为8:

 int a = 32; a = a >> 2; // a now contains 8 

当一个值的位被“移走”时,这些位就会丢失。 例如,下一个代码片段将值35移到右边的两个位置,这导致两个低位被丢失,结果又被设置为8。

 int a = 35; a = a >> 2; // a still contains 8 

在二进制中查看相同的操作更清楚地显示了这是怎么发生的:

 00100011 35 >> 2 00001000 8 

每次将值向右移时,它将该值除以2,并丢弃任何余数。 你可以利用这个优势来进行2的高性能整数除法。当然,你必须确定你没有把右边的任何位移走。 当你向右移动时,向右移动的顶部(最左边的)位用顶部位的前一个内容填充。 这就是所谓的符号扩展,当你把它们移到正确的位置时,它可以保留负数的符号。 例如, –8 >> 1–4 ,二进制是

 11111000 –8 >>1 11111100 –4 

值得注意的是,如果右移-1,结果总是保持-1,因为符号扩展不断引入更多的高位。 有时,当你将它们移到右边时,不要求符号扩展值。 例如,以下程序将字节值转换为其hexstring表示forms。 请注意,移位后的值通过与0x0f进行AND操作来屏蔽掉任何符号扩展位,以便该值可用作hex字符数组的索引。

 // 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用户提供的有关位移的大量详细信息,请查看几年前发布的问题,这些问题最终帮助我获得了: 绝对初学者位移的指南 。 (那些张贴在那里的人们对这个问题深有体会,希望能对你有所帮助。)