java中的无符号移位运算

本文深入解析Java中的位运算,包括无符号右移(>>>)和左移位运算(<<)。无符号右移不仅会改变数值大小,还会改变正负号,对负数进行该运算将变为正数。左移位运算则不会区分有符号和无符号,适用于所有数值。文章通过具体实例展示了位运算对二进制数的影响。
摘要由CSDN通过智能技术生成

1. 无符号右移   >>>  或 >>> =

无符号右移(>>>)跟右移(>>)运算符不一样。

右移不改变数的正负。

对于一个正数,无符号右移不会变成负数(相当于除以1再取整);但是对于一个负数,无符号右移会将负数变成正数;

 
  

int i = -4;
System.out.printf("%-10d %32s\n", i, Integer.toBinaryString(i));
i >>>= 1;  // 无符号右移1位
System.out.printf("%-10d %32s\n", i, Integer.toBinaryString(i));

i >>>= 1;
System.out.printf("%-10d %32s\n", i, Integer.toBinaryString(i));

输出:

-4                  11111111111111111111111111111100       //负数在java中以补码形式存储,-4的补码表示是11111111111111111111111111111100
2147483646     1111111111111111111111111111110       //无符号右移1位,-4的补码表示的符号位也右移了1位,导致符号位变成0,成为正数
1073741822       111111111111111111111111111110       //再无符号右移1位

int i = 15;
System.out.printf("%-10d %32s\n", i, Integer.toBinaryString(i));
i >>>= 1;
System.out.printf("%-10d %32s\n", i, Integer.toBinaryString(i));

输出:

15     1111  
7         111  //对正数进行无符号右移,高位补0

int i = 0x80000000;
System.out.printf("%-12d %32s\n", i, Integer.toBinaryString(i));
i >>>= 1;
System.out.printf("%-12d %32s\n", i, Integer.toBinaryString(i));
i >>>= 1;
System.out.printf("%-12d %32s\n", i, Integer.toBinaryString(i));

输出:

-2147483648 10000000000000000000000000000000       //最小负数的补码表示
1073741824    1000000000000000000000000000000       //符号位右移一位,变成正数
536870912        100000000000000000000000000000

总结:

无符号右移的叫法,容易让人误解。虽然叫作无符号右移运算,让人第一印象以为是不对符号位进行移位,其实却是连同符号位一起右移;

对复数进行无符号右移,符号位也一起右移,将会变成正数;

对正数进行若干次无符号右移,得到的永远都是正数或0;

 

2. 左移位运算  <<  或  <<=

跟右移运算不同的是,无符号左移和左移是一样的。因此java没有无符号左移运算。(<<<和<<<=将报错)

因为无右移运算需要考虑符号位的右移,而符号位只存在于二进制表示的最左边,最右边没有。

所以不用区分无符号左移和左移运算。

int i = 0x80000000;
System.out.printf("%-12d %32s\n", i, Integer.toBinaryString(i));
i <<= 1;
System.out.printf("%-12d %32s\n", i, Integer.toBinaryString(i));
i >>= 1;
System.out.printf("%-12d %32s\n", i, Integer.toBinaryString(i));

输出:

-2147483648 10000000000000000000000000000000    
0                                                                        0    //最小负数左移1位,将变成0
0                                                                        0

转载于:https://www.cnblogs.com/HITSZ/p/9181318.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值