移位运算符解析

Posted 秋秋秋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了移位运算符解析相关的知识,希望对你有一定的参考价值。

移位运算符分为左移(<<)、右移(>>)、无符号位移(>>>)。
<<:空位补0,最高位丢弃。相当于数据乘以2的n次幂。
正数的左移:
int a=3<<2;
System.out.println(a);

 

3的原码:11
原码      00000000 00000000 00000000 00000011
反码      00000000 00000000 00000000 00000011
补码      00000000 00000000 00000000 00000011
左移(00)000000 00000000 00000000 0000001100(补码)
正数的原反补都相同,所以结果为12。
负数的左移:
int a=-3<<2;
System.out.println(a);
 
 
-3的原码
原码           10000000 00000000 00000000 00000011
反码           11111111   11111111   11111111   11111100
补码           11111111   11111111   11111111   11111101
左移     (11)11111111   11111111   11111111   11110100(补码)
反码           11111111   11111111   11111111   11110011
原码           10000000  00000000 00000000 00001100(-12)
 
>>:最高位是0,左边补齐0;最高位是1,左边补齐1。相当于数据除以2的n次幂。
原理与左移相同。
 
>>>:无论最高位是0还是1,左边补齐0。
正数>>>的结果与>>相同,重点看负数。
int a=-12>>>2;
System.out.println(a);

 

-12的原码
原码         10000000 00000000 00000000 00001100
反码         11111111   11111111   11111111   11110011
补码         11111111   11111111   11111111   11110100
>>>          0011111111   11111111   11111111   111101(00)(补码)
变成了正数,原反补都相同,通过计算得?1073741821?。
 

 

以上是关于移位运算符解析的主要内容,如果未能解决你的问题,请参考以下文章

位运算: 如何用移位运算实现乘法操作

(计算机组成原理)第二章数据的表示和运算-第二节3:定点数的移位运算(算数移位逻辑移位和循环移位)

Java移位运算符

java 移位运算

如何在 Swift 中使用具有隐式/强制展开的移位运算符

二进制算术移位和逻辑移位运算,及移位运算对数据的影响(详解及过程推导)