Java中的Double Greater Than Sign(>>)?

Pet*_*y B 37 java

这个>>符号在Java中意味着什么?我以前从未见过它,但今天遇到它.我尝试在Google上搜索它,但没有找到任何有用的东西.

Yuv*_*dam 73

>>操作是按位向右移位运算符.

简单的例子:

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
Run Code Online (Sandbox Code Playgroud)

负数表现相同:

int i = -4;
System.out.println(i >> 1); // prints -2
System.out.println(i << 1); // prints -8
Run Code Online (Sandbox Code Playgroud)

一般来说 - i << k相当于i*(2^k),i >> k相当于i/(2^k).

在所有情况下(就像任何其他算术运算符一样),您应始终确保不会溢出数据类型.

  • 如果你举一个带负数的例子,你就会得到我的upvote. (2认同)

Cli*_*int 37

这是位移操作符. 文档

带符号的左移运算符"<<"将位模式向左移位,带符号的右移运算符">>"将位模式向右移位.位模式由左侧操作数给出,位置数由右侧操作数移位.无符号右移运算符">>>"将零移动到最左侧位置,而">>"之后的最左侧位置取决于符号扩展.


Chr*_*eis 17

它改变了比特......

以下是关于java运算符的一些信息

例如

101  = 5
Shifting out the right "1"
10 = 2
Shifting the other way...
1010 = 10
Run Code Online (Sandbox Code Playgroud)


sta*_*bit 7

右移:

右移位运算符>>将值中的所有位向右移动指定的次数.它的一般形式:value >> num这里,num指定右移值的位置数.也就是说,>>将指定值中的所有位向右移动num指定的位位置数.以下代码片段将值32向右移动两个位置,从而将值设置为8:

int a = 32;
a = a >> 2; // a now contains 8
Run Code Online (Sandbox Code Playgroud)

当某个值具有"移位"的位时,这些位将丢失.例如,下一个代码片段将值35移位到右边两个位置,这导致两个低位比特丢失,再次导致设置为8.

int a = 35;
a = a >> 2; // a still contains 8
Run Code Online (Sandbox Code Playgroud)

查看二进制中的相同操作更清楚地显示了这种情况:

00100011 35 >> 2
00001000 8
Run Code Online (Sandbox Code Playgroud)

每次将值向右移动时,它会将该值除以2,并丢弃任何余数.你可以利用这个来实现2的高性能整数除法.当然,你必须确保你没有将任何位移到右端.向右移动时,右移显示的顶部(最左侧)位用顶部位的先前内容填充.这称为符号扩展,用于在向右移动时保留负数的符号.例如,–8 >> 1–4,二进制,是

11111000 –8 >>1
11111100 –4
Run Code Online (Sandbox Code Playgroud)

有趣的是,如果向右移动-1,结果始终保持为-1,因为符号扩展会在高位中引入更多的符号.有时,当您将值向右移动时,不希望对值进行符号扩展.例如,以下程序将字节值转换为其十六进制字符串表示形式.请注意,移位值通过与0x0f进行AND运算来屏蔽,以丢弃任何符号扩展位,以便该值可用作十六进制字符数组的索引.

// 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]);
}
}
Run Code Online (Sandbox Code Playgroud)

这是这个的输出:

b = 0xf1
Run Code Online (Sandbox Code Playgroud)


man*_*eka 5

那是一个右移。

  • 很棒的答案:D (4认同)