java中左移、右移和无符号右移
我们在看某些jdk的源码时经常能看到”>>”(右移)、”<<“(左移)、”>>>”(无符号右移),比方下面这段
1550050893(1).jpg
它们经常被用来扩充动态集合的大小,下面我们看段代码看下”>>”、”<<“、”>>>”都做了什么操作。
我们写下面这段代码,先看左移
public class Main2 { public static void main(String[] args) { Integer aValue =10; show(aValue); Integer leftMoveValue1 =aValue <<1; //左移1位 show(leftMoveValue1); Integer leftMoveValue2 =aValue <<2; //左移2位 show(leftMoveValue2); Integer leftMoveValue3 =aValue <<2;//左移3位 show(leftMoveValue3); } /** * 打印数字对应的二进制字符串 * @param number */ public static void show(Integer number) { System.out.println(Integer.toBinaryString(number)); }}
结果是:
101010201010040101000801010000
原来的值为10
左移一位值为10*2的1次方 20左移两位值为10*2的2次方 40左移两位值为10*2的3次方 80
表现在二进制上,是将二进制的低位补0,既为左移
接下来我们将左移变成右移,代码如下:
public class Main2 { public static void main(String[] args) { Integer aValue =10; show(aValue); Integer leftMoveValue1 =aValue >>1; //右边移1位 show(leftMoveValue1); Integer leftMoveValue2 =aValue >>2; //右移2位 show(leftMoveValue2); Integer leftMoveValue3 =aValue >>2;//右移3位 show(leftMoveValue3); } /** * 打印数字对应的二进制字符串 * @param number */ public static void show(Integer number) { System.out.println(Integer.toBinaryString(number)); }}
结果是:
101010510121011
原来的值为10
右移一位值为10/2的1次方 5右移两位值为10/2的2次方 2右移两位值为10/2的3次方 1
表现在二进制上,是将二进制的低位直接去掉,既为右移,右移n位相当于10/2的n次方
接下来我们将左移变成无符号右移,代码如下:
public class Main2 { public static void main(String[] args) { Integer aValue =10; show(aValue); Integer leftMoveValue1 =aValue >>>1; //无符号右边移1位 show(leftMoveValue1); Integer leftMoveValue2 =aValue >>>2; //无符号右移2位 show(leftMoveValue2); Integer leftMoveValue3 =aValue >>>2;//无符号右移3位 show(leftMoveValue3); } /** * 打印数字对应的二进制字符串 * @param number */ public static void show(Integer number) { System.out.println(Integer.toBinaryString(number)); }}
结果是:
101010510121011
原来的值为10
无符号右移一位值为10/2的1次方 5无符号右移两位值为10/2的2次方 2无符号右移两位值为10/2的3次方 1
同为整数10时,我们看不到右移和无符号右移的区别
于是我们把右移中的值10变更为-10,先看看右移结果
-10>>1
-10>>2
-10>>3
-1011111111111111111111111111110110-511111111111111111111111111111011-311111111111111111111111111111101-211111111111111111111111111111110
我们看到,负数右移依然是将二进制的最低位直接去掉,但是保证了位数不变,在最高位补了1,负数的右移反而变大了
我们继续看看无符号右移
-10>>>1
-10>>>2
-10>>>3
-101111111111111111111111111111011021474836431111111111111111111111111111011107374182111111111111111111111111111110153687091011111111111111111111111111110
负数进行无符号右移时变成了很大的正数。相当于是将低位去掉后,在高位补了0,
我后来又试了一下 -1左移一位时,刚好为2147483648,正好为Interge.maxValue的值
先这样吧…
后记:
以后再也不怕在源码中看见左移右移了,其实自己都能算出来的
说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » java中左移、右移和无符号右移
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » java中左移、右移和无符号右移