Java中的移位运算

<< 左移运算

将一个二进制位的操作数按指定移动的位数向左移位,移出位被丢弃,右边的空位一律补0

作用

每左移一位 <<1 表示将该值乘以2

左移n位 < 表示将该值乘以2n

示例

6<<2

6 -> 0000 0000 0000 0000 0000 0000 0000 0110

6<<2 -> 0000 0000 0000 0000 0000 0000 0001 1000

答案 -> 24

-6<<2

-6 -> 1000 0000 0000 0000 0000 0000 0000 0110

-6 的补码 (取反码(除符号位)后加一)-> 1111 1111 1111 1111 1111 1111 1111 1010

-6<<2 -> 1111 1111 1111 1111 1111 1111 1110 1000

-6<<2 的原码(取反码(除符号位)后加一)-> 1000 0000 0000 0000 0000 0000 0001 1000

答案 -> -24

>> 右移运算

将一个二进制位的操作数按指定移动的位数向左移位,移出位被丢弃

当为正数时,补0,当为负数时,补1

作用

每右移一位 >>1 表示将该值除以2

左移n位 >>n 表示将该值除以2n

当不能被2整除时,减一后再除以2

示例

6>>2

6 -> 0000 0000 0000 0000 0000 0000 0000 0110

6>>2 (6为正数,补0) -> 0000 0000 0000 0000 0000 0000 0000 0001

答案 -> 1

-6>>2

-6 -> 1000 0000 0000 0000 0000 0000 0000 0110

-6 的补码 (取反码(除符号位)后加一)-> 1111 1111 1111 1111 1111 1111 1111 1010

-6>>2 (-6为负数,补1) -> 1111 1111 1111 1111 1111 1111 1111 1110

-6>>2 的原码(取反码(除符号位)后加一)-> 1000 0000 0000 0000 0000 0000 0001 0010

答案 -> -2

>>> 无符号右移运算

>>右移运算相同,但补位时不考虑符号,一律补0

示例

-6>>2

-6 -> 1000 0000 0000 0000 0000 0000 0000 0110

-6 的补码 (取反码(除符号位)后加一)-> 1111 1111 1111 1111 1111 1111 1111 1010

-6>>2 (一律补0) -> 0011 1111 1111 1111 1111 1111 1111 1110

答案 -> 1073741822

注意

理解java中的int

java中的int为32位,其中第32位为符号位,1表示负数,0表示正数

因此在左移运算时,可能会出现由正数变成了负数的情况

当移位数大于等于32位操作

当移位数大于等于32位操作时,会先和32求余(%)后再进行移位操作,因此32位移位表示没有移位,值不变

当long类型进行移位操作时,long类型在二进制中的体现是64位的,因此会先和64求余(%)后再进行移位操作,因此64位移位表示没有移位,值不变

其它几种整形byte,short移位前会先转换为int类型(32位)再进行移位

你可能感兴趣的:(Java中的移位运算)