java移位符运算的讲解

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
    }
}

猜你喜欢

转载自blog.csdn.net/mochou111/article/details/84768817
今日推荐