最近在看Java的基础知识,虽然自己目前在做Android,但是Android就是用Java编写的,所以Java也是很重要的。故自己在这里记录一下自己的学习过程,以供查阅。
Java中有这样几个运算符,>> << >>>,他们的含义已经相应的用途这次我会把它们记录下来。这里再补充一句,没有<<<运算符。
“>>”运算符:将二进制位进行右移操作。
“<<”运算符:将二进制位进行左移操作。
“>>>”运算符:无符号右移,忽略符号位,空位都以0补齐。
从上面的论述可能还是没有弄明白,后面就来举例子:
int n = 31;//n二进制为11111
int m = (n >> 3);//m=11(二进制)
System.err.println("result is " + m);
结果是:
result is 3
也就是把11111向右移动了3位,也就是11,最后的结果是3.
再看这一段代码:
int n = 18;//n二进制为10010
int m = (n << 3);//m = 10010000
System.err.println("result is " + m);
结果是:
result is 144
上面的都是正数进行的移位计算,直接移动即可。那我们再看下面这种情况:
如果是负数的话,进行上述的移位运算应该是什么样子呢?首先我们要知道负数转成二进制数应该是什么样子的:
int n = -15;
String m = Integer.toBinaryString(n);
System.err.println(m);
结果是:
11111111111111111111111111110001
下面就来把负数转换成二进制数的规则描述一下,其中省略了补码,反码等概念,直接描述过程:
1.首先,我们假设需要转换的数字是上述的-15,我们首先取它的绝对值,也就是15,并使用15的二进制数:00000000 00000000 00000000 00001111
2.然后,把每一位都取反,我们得到的是11111111 11111111 11111111 11110000
3.第三步,在最后一位加1,得到11111111 11111111 11111111 11110001,这也就是我们最后的结果。
同样地,负的二进制数转化成为正常的十进制数的过程,应该是用上面的步骤倒着执行即可。
下面我们来看代码:
int n = -15;
int m = (n >> 3);
System.err.println("result is " + Integer.toBinaryString(m));
结果是:
11111111111111111111111111111110(转成10进制可以从上面看)
也就是转成11111111 11111111 11111111 11110001后,整体向右移动三位,并且左侧补全1,最后得到的答案就是11111111111111111111111111111110。
同样地,如果是左移运算符<<的话:
int n = -15;
int m = (n << 3);
System.err.println("result is " + Integer.toBinaryString(m));
结果是:
result is 11111111111111111111111110001000
也就是整体左移三位,最右侧补全0即可。
最后我们来看>>>运算符:
int n = 15;
int m = (n >>> 3);
System.err.println("result is " + Integer.toBinaryString(m));
结果是
result is 1
如果输入值是负数的话,
int n = -15;
int m = (n >>> 3);
System.err.println("result is " + Integer.toBinaryString(m));
结果是
result is 11111111111111111111111111110
正数情况下就不用解释了,我们来看负数,-15的二进制数应该是11111111 11111111 11111111 11110001,那么当我们右移三位的时候,同时左侧空出来的位数补全为0,即00011111111111111111111111111110,也就是最后的结果11111111111111111111111111110。所以,>>>的计算规则就是, 忽略了符号位扩展,0补最高位。