dan*_*ben 390
>>
是算术右移,>>>
是逻辑右移.
在算术移位中,符号位被扩展以保持数字的有符号.
例如:以8位表示的-2将是11111110
(因为最高有效位具有负权重).使用算术移位将它向右移一位会给你11111111
,或-1.然而,逻辑右移并不关心该值可能代表有符号数; 它只是将所有内容移动到右侧,并从左侧填充0.使用逻辑移位将我们的-2右移一位会给出01111111
.
pol*_*nts 99
>>>
是无符号转换; 它将插入0. >>
已签名,并将扩展符号位.
换档操作符包括左移
<<
,右移>>
和无符号右移>>>
.值
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.
1 >>> 32 == 1
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的幂必须保持符号相同.
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)
右移逻辑运算符(>>> 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 次 |
最近记录: |