Java中的<< 和 >> 和 >>> 详细分析
<<表示左移移,不分正负数,低位补0;
注:以下数据类型默认为byte-8位
左移时不管正负,低位补0
正数:r = 20 << 2
| 20的二进制补码: | 0001 0100 |
|---|---|
| 向左移动两位后: | 0101 0000 |
| 结果: | r = 80 |
负数:r = -20 << 2
| -20 的二进制原码 : | 1001 0100 |
|---|---|
| -20 的二进制反码 : | 1110 1011 |
| -20 的二进制补码 : | 1110 1100 |
| 左移两位后的补码: | 1011 0000 |
| 反码: | 1010 1111 |
| 原码: | 1101 0000 |
| 结果: | r = -80 |
>>表示右移,如果该数为正,则高位补0,若为负数,则高位补1;
注:以下数据类型默认为byte-8位
正数:r = 20 >> 2
| 20的二进制补码: | 0001 0100 |
|---|---|
| 向右移动两位后: | 0000 0101 |
| 结果: | r = 5 |
负数:r = -20 >> 2
| -20 的二进制原码 : | 1001 0100 |
|---|---|
| -20 的二进制反码 : | 1110 1011 |
| -20 的二进制补码 : | 1110 1100 |
| 右移两位后的补码: | 1111 1011 |
| 反码: | 1111 1010 |
| 原码: | 1000 0101 |
| 结果: | r = -5 |
>>>表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0
正数: r = 20 >>> 2
的结果与 r = 20 >> 2 相同;
负数: r = -20 >>> 2
注:以下数据类型默认为int 32位
-20:
| 源码: | 10000000 00000000 00000000 00010100 |
|---|---|
| 反码: | 11111111 11111111 11111111 11101011 |
| 补码: | 11111111 11111111 11111111 11101100 |
| 右移: | 00111111 11111111 11111111 11111011 |
| 结果: | r = 1073741819 |
版权声明:本文为xiaohaigary原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。