Java中的>>运算和<<运算

it2026-01-20  7

有一个规律:

>>运算:M >> n  = M / 2n

<<运算: M << n  = M * 2^n

注意带符号运算。

前置知识:

首先想要知道>>运算和<<运算得先知道原码、反码、补码。

先将一个10进制整数转化为32位二进制数。

正整数的原码、反码和补码是一样的。

——————————————————————————————————————————————————

负整数的反码:符号位不变,其它按位取反。

负整数的补码:原码符号位不变,数值位按位取反,末位再加1(即反码加1)。

例如:求-2的原码、补码、反码

原码:1000 0000 0000 0000 0000 0000 0000 0010 反码:1111 1111 1111 1111 1111 1111 1111 1101 补码:1111 1111 1111 1111 1111 1111 1111 1110

<<运算:移补码,左移后在低位补0。

正数:以2<<2为例,它的原码即补码,则

0000 0000 0000 0000 0000 0000 0000 0010 原码(补码) 0000 0000 0000 0000 0000 0000 0000 1000 左移2位(为8)

2<<2移动后的补码即为答案,所以答案为8。

负数:以-2<<2为例,先求出它的补码,再将补码左移2位,再将移动后的补码-1求出反码,再按符号位不变,按位取反求出原码。

1111  1111  1111  1111  1111  1111  1111  1110 补码 1111  1111  1111  1111  1111  1111  1111  1000 左移2位 -                                            1 补码-1 1111  1111  1111  1111  1111  1111  1111  0111 反码 1000  0000  0000  0000  0000  0000  0000  1000 原码(-8)

则-2<<2的答案为-8。

>>(右移)运算:移补码,如果该数为正数,则高位补0,若为负数,则高位补1。

正数:求16>>2的结果,先将16的二进制补码右移两位,高位补0,那么得到:

0000 0000 0000 0000 0000 0000 0001 0000 原码(即补码) 0000 0000 0000 0000 0000 0000 0000 0100 右移2位

得到补码即为原码,转换为十进制,那么16>>2的结果为4。负数:求-16>>2的结果,先求-16的补码,再右移2位,高位补1,再求反码,再求原码,那么得到:

1000 0000 0000 0000 0000 0000 0001 0000 原码 1111 1111 1111 1111 1111 1111 1110 1111 反码 + 1 1111 1111 1111 1111 1111 1111 1111 0000 补码 1111 1111 1111 1111 1111 1111 1111 1100 右移两位后的补码(高位补1) - 1 1111 1111 1111 1111 1111 1111 1111 1011 右移两位后的反码 1000 0000 0000 0000 0000 0000 0000 0100 右移两位后的原码

将得到的原码转换为十进制,那么-16>>2的结果为-4。

总结:

套用规律即可,两条公式搞定。

最新回复(0)