Java 两者之间的差异>&燃气轮机&燃气轮机;及>&燃气轮机;

Java 两者之间的差异>&燃气轮机&燃气轮机;及>&燃气轮机;,java,syntax,operators,Java,Syntax,Operators,Java中的>>和>运算符之间有什么区别?它们都是右移的,但是>是无符号的 从: 无符号右移运算符“>>>”将零移到最左侧位置,而“>>”之后的最左侧位置取决于符号扩展 >>总是将0放在最左边的位,而>将根据它的符号放1或0。>是算术右移,>是逻辑右移 在算术移位中,符号位被扩展以保持数字的符号性 例如:8位中表示的-2将是11111110(因为最高有效位的权重为负)。使用算术移位将其右移一位将得到11111111,或-1。然而,逻辑右移并不关心该值是否可能表示有符号的数字;它只是将所有内容向右

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

它们都是右移的,但是
>
无符号的

从:

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


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

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

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


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

>
是无符号移位;它将插入0<代码>>已签名,并将扩展符号位

移位运算符包括左移位
,和无符号右移位
>

n>>s
的值是
n
右移的
s
位位置,符号扩展名为

n>>s
的值是
n
右移的
s
位,扩展名为

为了让事情更清楚,添加积极的对应项

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"
因为它是正的,所以有符号和无符号移位都会将0添加到最左边的位

相关问题
    • 1>>32==1
阅读更多关于

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

>>
之后最左边的位置取决于符号扩展

简单地说,
>>
总是将移动到最左边的位置,而
>
根据数字的符号移动,即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));

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

-1 (in 32-bit): 11111111111111111111111111111111
-2 (in 32-bit): 11111111111111111111111111111110
>>1
操作变为:

2147483647: 01111111111111111111111111111111
-1: 11111111111111111111111111111111
右移位算术运算符(
>N
)也将位向右移位N个位置,但保留符号位并用1填充最左边的N个位。例如:

-1 (in 32-bit): 11111111111111111111111111111111
-2 (in 32-bit): 11111111111111111111111111111110
>1
操作变为:

2147483647: 01111111111111111111111111111111
-1: 11111111111111111111111111111111
逻辑右移(
v>>n
)返回一个值,其中
v
中的位已向右移动
n
位位置,0从左侧移入。考虑移位二进制值:

的8位值
01111111 >>> 2 = 00011111
10000000 >>> 2 = 00100000
如果我们将位解释为无符号非负整数,则逻辑右移的效果是将数字除以相应的2次方。但是,如果数字是二补表示,则逻辑右移不能正确划分负数。例如,当位被解释为无符号数时,上面的第二个右移位将移位128到32。但是,正如Java中的典型情况一样,当以2的补码解释位时,它会将-128移到32

因此,如果为了除以二的幂而移位,则需要算术右移(
v>>n
)。它返回一个值,其中
v
中的位已向右移位
n
位位置,并且v的最左边位的副本从左侧移入:

01111111 >> 2 = 00011111
10000000 >> 2 = 11100000

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

虽然我同意并理解算术移位可以用来将有符号数字乘以
2^k
,但我发现这是每个人的答案,这很奇怪。一个比特串不是一个数字,
>
总是可以用于任何比特串:它总是做同样的事情,不管比特串扮演什么角色,也不管它是否有“符号”的概念。通过讨论操作数未被解释为有符号数的情况来扩展您已经很好的答案,可以吗?我的抱怨有道理吗?为什么你说一串位不是数字?你会说十进制数字序列不是数字吗?@danben讨论它是否是数字只有当你把它与上下文联系起来时才有意义。如果互联网只是电,那么我同意字符串只是一个数字。@danben但实际上,我认为齐吉真正指的是(
String
也可以被视为
char[]
)。他并不是说字符不是一个数字;他只是说这是一个未签名的数字。我想这就是他丢失的地方。@Ziggy是对的:不是每一串位都是数字,也不是每一串十进制数字都是数字。例如:电话号码、邮政编码(在许多国家)等都是十进制数字串,但加、减或乘都没有意义,所以它们不是真正的数字。它们恰好是十进制数字的字符串,但应被视为字符字符串