java中的符号位移

本文转载出处

目录
需要了解的几个点
移位的过程
示例
特殊情况
前置知识点

首先需要明确的几个点
  • java中数字是以二进制补码的形式进行存储和计算的
  • java中的左移不区分有符号和无符号,而左移需要区分
  • byte、short两种类型的移位运算会转换成int类型的移位运算

移位的过程

如流程图所示,转换过程为:

  • 先将数字转换为它的二进制补码形式
  • 对于左移,将所有比特位全部移动,右边空位补0
  • 对于无符号右移,将所有比特位全部右移,左边空位补0
  • 正数的有符号右移和无符号右移相同
  • 负数的有符号位移需要符号位保持不动,其他位右移,空位补1
  • 移位之后,按照补码求原码的方式,求出移位后数的值


示例

用-4和4来作为一个移位的示例

二进制补码>>1>>>1<<1
400000000 00000000 00000000 0000010000000000 00000000 00000000 0000001000000000 00000000 00000000 0000001000000000 00000000 00000000 00001000
-411111111 11111111 11111111 1111110011111111 11111111 11111111 1111111001111111 11111111 11111111 1111111011111111 11111111 11111111 11111000

对于4来说,由于它是正数,它的补码、原码相同,可以很明显的看出:

4 >>1 = 2;
4 >>>1 = 2;
4 <<1 = 8;

对于-4来说,由于它是负数,所以原码和补码不相同,需要对移位后的补码求原码:

-4不移位-4>>1-4>>>1-4<<1
补码11111111 11111111 11111111 1111110011111111 11111111 11111111 1111111001111111 11111111 11111111 1111111011111111 11111111 11111111 11111000
原码10000000 00000000 00000000 0000010010000000 00000000 00000000 0000001001111111 11111111 11111111 1111111010000000 00000000 00000000 00001000
十进制数-4-22,147,483,646-8

特殊情况

先看下面的例子

@Test
public void test(){
    int a=1073741824;
    int b= a<<1;
    System.out.println("a="+Integer.toBinaryString(a));
    System.out.println("b="+Integer.toBinaryString(b));
    System.out.println("a="+a);
    System.out.println("b="+b);
}

这个例子的输出为如下

a=1000000000000000000000000000000
b=10000000000000000000000000000000
a=1073741824
b=-2147483648

从上面可以看出,将a左移1位后得到b,对于b的二进制补码,它没有对应的原码,实际上,b也是int类型的最小值,这个问题也同样出现在其他类型上。这个问题可以参考下面的文章:byte类型为什么是-128~127

前置知识点

什么是原码、补码、以及反码

** 这篇文章对于源码、补码、反码,这篇文章讲的很详细 **
** 原码 **:用最高位表示符号位,1表示负号,0表示正号。其他位存放该数的二进制的绝对值。
** 反码 **:正数的反码还是它本身,负数的反码是除符号位(即最高位)的其他位取反
** 补码 **: 正数的补码等于它的原码,负数的补码等于它的反码加一

原码反码补码
0000000000000000000000000
+1000000010000000100000001
+2000000100000001000000010
-1100000011111111011111111
-2100000101111110111111110

如何由补码求原码
  • 正数的补码和原码相同
  • 负数的原码等于其补码符号位不变,其余各位取反后加1
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值