版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mochou111/article/details/84768817
我们都看过这样一个图片,讲码农,黑客和2B程序员的区别
所以为什么1L<<32和2的32次方是相等的呢,在探讨之前我们先记住一个结论,等探讨完之后,我们会对结论更加的深刻理解
num << n 等于 num * (2 ^ n)
num >> n 等于 num / (2 ^ n) 如果相除结果小于1,则为0
即 32 << 2 的结果是32 * 4 = 128
现在开始探讨其根本原理,知其然知其所以然
>>,<<这些叫做移位符,顾名思义就是用来移位的,后面的n代表移多少位,移位之后,num是正数时高位(低位)后面补0,负数时则补1
众所周知,计算机内部是二进制运算,所有的数都是由0,1组成,十进制里的32 转换为二进制是 0010 0000
那么32 << 2就是 往左移动2位并在低位后面补0 所以0010 0000 变为了 1000 0000 转换为十进制为2 ^ 7 = 128
同样的,32 >> 2 就是往后移两位并在高位补0 即 0010 0000 变为了 0000 1000 转化为十进制为 2 ^ 3 = 8
这里拿32举例,是应题而用,其他非2指数的数也可以,比如20 ,66等
至于>>>叫做无符号右移,从前面我们就知道了,正数与负数左移和右移高低位补数是不同的,前者补0,后者补1,但是>>>是无符号右移,即不管你是正数还是负数,统一右移并在高位补0
代码举例:
package com.mochou.progress;
public class TestYiWei {
public static void main(String[] args){
TestYiWei testYiWei = new TestYiWei();
testYiWei.testLeft();
testYiWei.testRight();
testYiWei.testPlusRight();
}
public void testLeft(){
int b = 1<<10;
int a = (int)Math.pow(2,10);
System.out.println("左移结果是:"+b);
System.out.println("求指结果是:"+a);
if(a == b){
System.out.println("左移的n位数和2的n次方是相等的");
}
else{
System.out.println("不等");
}
}
public void testRight(){
int b = 32>>3;
System.out.println("右移结果是:"+b);
int c = 32>>10;
System.out.println("右移到不能再移最后为:"+c);
}
public void testPlusRight(){
int d = 32>>>3;
System.out.println("数字为正时:"+d);
int e = -32>>>3;
System.out.println("数字为负时:"+e);
}
}