>>>和>>之间的区别

Vip*_*pul 354 java syntax operators

运算符>>>>>Java 之间有什么区别?

dan*_*ben 390

>>是算术右移,>>>是逻辑右移.

在算术移位中,符号位被扩展以保持数字的有符号.

例如:以8位表示的-2将是11111110(因为最高有效位具有负权重).使用算术移位将它向右移一位会给你11111111,或-1.然而,逻辑右移并不关心该值可能代表有符号数; 它只是将所有内容移动到右侧,并从左侧填充0.使用逻辑移位将我们的-2右移一位会给出01111111.

  • 为什么你说一串位不是一个数字?你会说十进制数字序列不是数字吗? (10认同)
  • 虽然我同意并理解算术移位_可以用来将带符号的数字乘以'2 ^ k`,但我觉得奇怪的是这是每个人的答案.一串位不是一个数字,并且`>>`总是可以用在任何位的字符串上:它总是做同样的事情,无论位串正在播放的角色如何,无论它是否有一个概念'标志'.当您的操作数_not_被解释为带符号的数字时,是否可以通过讨论案例扩展您已经很好的答案?我的投诉是否有意义? (7认同)
  • @danben如果将它链接到上下文,讨论它是否是一个数字才有意义.如果互联网只是电力,那么我同意String只是一个数字. (4认同)
  • @Ziggy是对的:并非每个字符串都是数字,并非每个十进制数字序列都是数字.例如:电话号码,邮政编码(在许多国家/地区)等是十进制数字的字符串,但添加,减去或乘以它们没有意义,所以它们不是真正的数字.它们碰巧是十进制数字的字符串,但应该被视为字符串.(加拿大和英国的邮政编码包含字母和数字.) (4认同)

pol*_*nts 99

>>>是无符号转换; 它将插入0. >>已签名,并将扩展符号位.

JLS 15.19移位运算符

换档操作符包括左移<<,右移>>和无符号右移>>>.

n>>s是带有符号扩展的n右移位s位置.

n>>>s是带有零扩展的n右移位s位置.

    System.out.println(Integer.toBinaryString(-1));
    // prints "11111111111111111111111111111111"
    System.out.println(Integer.toBinaryString(-1 >> 16));
    // prints "11111111111111111111111111111111"
    System.out.println(Integer.toBinaryString(-1 >>> 16));
    // prints "1111111111111111"
Run Code Online (Sandbox Code Playgroud)

为了使事情更清楚,增加积极的对应物

System.out.println(Integer.toBinaryString(121));
// prints "1111001"
System.out.println(Integer.toBinaryString(121 >> 1));
// prints "111100"
System.out.println(Integer.toBinaryString(121 >>> 1));
// prints "111100"
Run Code Online (Sandbox Code Playgroud)

由于它是正数,有符号和无符号的移位都会向最左边的位添加0.

相关问题

  • 由于你的例子,它变得更加清晰! (3认同)

Mat*_*att 47

他们都是右移,但>>>unsigned

文档:

无符号右移运算符">>>"将零移动到最左侧位置,而">>"之后的最左侧位置取决于符号扩展.

  • 你能用一个例子来解释吗? (12认同)

and*_*dru 39

逻辑右移(v >>> n)返回一个值,其中位v已经按n位位置向右移位,0从左侧移入.考虑移位以二进制编写的8位值:

01111111 >>> 2 = 00011111
10000000 >>> 2 = 00100000
Run Code Online (Sandbox Code Playgroud)

如果我们将这些位解释为无符号非负整数,则逻辑右移具有将数字除以相应的2的幂的效果.但是,如果数字是二进制补码表示,则逻辑右移不能正确地除去负数.例如,当位被解释为无符号数时,上面的第二右移位移128到32.但是,当在Java中典型地将位解释为二进制补码时,它会将-128移至32.

因此,如果要移动以除以2的幂,则需要算术右移(v >> n).它返回一个值,其中位v已经按n位位置向右移位,并且v的最左位的副本从左侧移入:

01111111 >> 2 = 00011111
10000000 >> 2 = 11100000
Run Code Online (Sandbox Code Playgroud)

当比特是二进制补码表示中的数字时,算术右移具有除以2的幂的效果.这是有效的,因为最左边的位是符号位.除以2的幂必须保持符号相同.


cor*_*iKa 38

>>>总是在最左边的位置放0,而>>根据它的符号放置1或0.


Bra*_*raj 10

阅读有关按位和位移算子的更多信息

>>      Signed right shift
>>>     Unsigned right shift
Run Code Online (Sandbox Code Playgroud)

位模式由左侧操作数给出,位置数由右侧操作数移位.无符号右移操作符>>> 移动到最左边的位置,

而后面最左边的位置>>取决于符号扩展.

简单地说,>>>总是移动到最左边的位置,>>基于数字的符号移位,即负数为1,正数为0.


例如,尝试使用负数和正数.

int c = -153;
System.out.printf("%32s%n",Integer.toBinaryString(c >>= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c <<= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c >>>= 2));
System.out.println(Integer.toBinaryString(c <<= 2));

System.out.println();

c = 153;
System.out.printf("%32s%n",Integer.toBinaryString(c >>= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c <<= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c >>>= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c <<= 2));
Run Code Online (Sandbox Code Playgroud)

输出:

11111111111111111111111111011001
11111111111111111111111101100100
  111111111111111111111111011001
11111111111111111111111101100100

                          100110
                        10011000
                          100110
                        10011000
Run Code Online (Sandbox Code Playgroud)


big*_*igT 5

右移逻辑运算符(>>> N)将位向右移位N位,丢弃符号位并用0表示填充N个最左位.例如:

-1 (in 32-bit): 11111111111111111111111111111111
Run Code Online (Sandbox Code Playgroud)

之后的>>> 1操作变为:

2147483647: 01111111111111111111111111111111
Run Code Online (Sandbox Code Playgroud)

右移算术运算符(>> N)也将位向右移位N个位置,但保留符号位并将N个最左位填充为1.例如:

-2 (in 32-bit): 11111111111111111111111111111110
Run Code Online (Sandbox Code Playgroud)

之后的>> 1操作变为:

-1: 11111111111111111111111111111111
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

193917 次

最近记录:

6 年,2 月 前