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次方。
无符号右移运算符(>>>)规则:
按二进制形式把所有的数字向右移动对应位数,低位移出(舍弃),高位的空位补零。对于正数来说和带符号右移相同,对于负数来说不同。