欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java 位移运算符

程序员文章站 2022-03-24 19:14:58
...

 

参考文章:

1、【精华】https://zhuanlan.zhihu.com/p/30108890

2、【精华】https://baike.baidu.com/item/%E7%A7%BB%E4%BD%8D%E8%BF%90%E7%AE%97%E7%AC%A6

 3、https://juejin.cn/post/6844903783307149319

 

public static void test() throws Exception {

    int intValue = 5;// 随意写一个数
    /**
     * 数学意义:
     * 在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
     * java 的 int 的位移操作:
     * 根据这个规则,左移32位后,右边补上32个0值是不是就变成了十进制的0了?
     * 答案是NO,当int类型进行左移操作时,左移位数大于等于32位操作时,会先求余(%)后再进行左移操作。
     * 也就是说左移32位相当于不进行移位操作,左移40位相当于左移8位(40%32=8)。
     * java 的 long 的位移操作:
     * 当long类型进行左移操作时,long类型在二进制中的体现是64位的,因此求余操作的基数也变成了64,
     * 也就是说左移64位相当于没有移位,左移72位相当于左移8位(72%64=8)
     * 
     * <pre>
     * ==== 左移:
     *  数学意义:
     *   在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
     *   value << n 等于 value * Math.pow(2, n) 【注意】Math.pow(double, double) 是double操作
     *   如: 7 << 3 == 56 ,对比 7 * Math.pow(2, 3) = 56.0
     * 溢出情况:
     * java 的 int 的位移操作:
     * 根据这个规则,左移32位后,右边补上32个0值是不是就变成了十进制的0了?
     * 答案是NO,当int类型进行左移操作时,左移位数大于等于32位操作时,会先求余(%)后再进行左移操作。
     * 也就是说左移32位相当于不进行移位操作,左移40位相当于左移8位(40%32=8)。
     * java 的 long 的位移操作:
     * 当long类型进行左移操作时,long类型在二进制中的体现是64位的,因此求余操作的基数也变成了64,
     * 也就是说左移64位相当于没有移位,左移72位相当于左移8位(72%64=8)
     * 
     * ==== 右移:
     * 数学意义:
     *  右移一位相当于除2,右移n位相当于除以2的n次方。
     *  value >> n 等于 value / Math.pow(2, n)
     *  如:8 >> 3 == 1 ,对比 8 / Math.pow(2, 3) = 1.0
     * 溢出情况:
     *  和左移一样,int类型移位大于等于32位时,long类型大于等于64位时,会先做求余处理再位移处理,byte,short移位前会先转换为int类型(32位)再进行移位。
     * 
     * </pre>
     */
    System.out.println("intValue:" + (intValue));// 打印intValue
    System.out.println("intValue左移1位:" + (intValue << 1));// 左移1位
    System.out.println("intValue左移8位:" + (intValue << 8));// 左移8位
    // 当int类型左移位数大于等于32位操作时,会先求余后再进行移位操作
    System.out.println("intValue左移32位:" + (intValue << 32));// 求余为32%32=0,相当于左移0位(不移位)
    System.out.println("intValue左移40位:" + (intValue << 40));// 求余为40%32=8,相当于左移8位
    System.out.println("intValue左移64位:" + (intValue << 64));// 求余为64%32=0,相当于左移0位(不移位)

    long longValue = 5L;
    System.out.println("longValue:" + (longValue));// 打印longValue
    System.out.println("longValue左移1位:" + (longValue << 1));// 左移1位
    System.out.println("longValue左移8位:" + (longValue << 8));// 左移8位
    // 当long类型左移位数大于等于64位操作时,会先求余后再进行移位操作
    System.out.println("longValue左移64位:" + (longValue << 64));// 求余为64%64=0,相当于左移0位(不移位)
    System.out.println("longValue左移72位:" + (longValue << 72));// 求余为72%64=8,相当于左移8位
    System.out.println("longValue左移128位:" + (longValue << 128));// 求余为128%64=0,相当于左移0位(不移位)

    System.out.println(String.format("%s == %s", 7 << 3, 7 * Math.pow(2, 3)));
    System.out.println(String.format("%s == %s", 8 >> 3, 8 / Math.pow(2, 3)));

}

 

 

左移运算符(<<)规则编辑:

数学意义:

    在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。

 

右移运算符(>>)规则:

数学意义:

    右移一位相当于除2,右移n位相当于除以2的n次方。

 

无符号右移运算符(>>>)规则:

    按二进制形式把所有的数字向右移动对应位数,低位移出(舍弃),高位的空位补零。对于正数来说和带符号右移相同,对于负数来说不同。