Java移位操作
2014-04-25 09:32
302 查看
移位操作符种类:
左移 <<
右移 >>
无符号右移 >>>
移位操作符的操作对象:二进制位,只能处理整数类型。
注:1、左移<<操作无正负区别,左移几位就在其二进制形式右端低位补几个0;
2、右移操作<<有符号之分,正数右移,高位补0,负数右移高位补1;
3、无符号右移>>>,一律在高位补0。
示例程序:
示例1:左移操作
注:这里二进制是32位,只不过显示形式中左端全0的部分是默认省略的。
注:负数在机器中是用其二进制补码表示的,-20的8位形式原码是10010100,反码是11101011,补码是11101100。
示例1:右移操作
程序运行结果:
几点注意:
1、如果是byte、short、char类型进行移位操作符,则先化为int类型,并且移位后得到的结果也是int类型。对于int型移位操作符右端的移动的位数的二进制表示中,只有低5位是有用的,因为低5位最大可以表示32,而int型最多移动32位。若是对long类型的数值进行移位操作符,那么最终得到的结果将是long类型。
2、如果对byte或short值进行移位操作,那么得到的结果是int类型,如果使用<<=或者>>=或者>>>=赋值操作,可能导致把int类型赋予byte或short类型,而导致截断发生精度损失,例如下面的示例程序
运行结果:
对于整形十进制数的左移操作相当于操作数乘以2的(移动的位数)次方,如,20<<2,也就等于20乘以2的2次方 = 80
对于整形十进制数的右移操作也就是操作数除以2的(移动的位数)次方,如,20>>2,也就等于20除以2的2次方 = 5,不能整除的情况下,就取结果的整数部分。
左移 <<
右移 >>
无符号右移 >>>
移位操作符的操作对象:二进制位,只能处理整数类型。
注:1、左移<<操作无正负区别,左移几位就在其二进制形式右端低位补几个0;
2、右移操作<<有符号之分,正数右移,高位补0,负数右移高位补1;
3、无符号右移>>>,一律在高位补0。
示例程序:
示例1:左移操作
int a = 20; System.out.println("a = " + a + " #Binary: " + Integer.toBinaryString(a)); a = a << 2; //等价于 a <<= 2; System.out.println("a = " + a + " #Binary: " + Integer.toBinaryString(a)); System.out.println("-----------------------------------"); a = -20; System.out.println("a = " + a + " #Binary: " + Integer.toBinaryString(a)); a = a << 2; //等价于 a <<= 2; System.out.println("a = " + a + " #Binary: " + Integer.toBinaryString(a));结果是:
a = 20 #Binary: 10100 a = 80 #Binary: 1010000 ----------------------------------- a = -20 #Binary: 11111111111111111111111111101100 a = -80 #Binary: 11111111111111111111111110110000
注:这里二进制是32位,只不过显示形式中左端全0的部分是默认省略的。
注:负数在机器中是用其二进制补码表示的,-20的8位形式原码是10010100,反码是11101011,补码是11101100。
示例1:右移操作
int a = 20; System.out.println("a = " + a + " #Binary: " + Integer.toBinaryString(a)); a = a >> 2; //等价于 a >>= 2; System.out.println("a = " + a + " #Binary: " + Integer.toBinaryString(a)); System.out.println("-----------------------------------"); a = -20; System.out.println("a = " + a + " #Binary: " + Integer.toBinaryString(a)); a = a >> 2; //等价于 a >>= 2; System.out.println("a = " + a + " #Binary: " + Integer.toBinaryString(a));程序运行结果:
a = 20 #Binary: 10100 a = 5 #Binary: 101 ----------------------------------- a = -20 #Binary: 11111111111111111111111111101100 a = -5 #Binary: 11111111111111111111111111111011实例3:无符号右移
int a = 20; System.out.println("a = " + a + " #Binary: " + Integer.toBinaryString(a)); a = a >>> 2; //等价于 a >>>= 2; System.out.println("a = " + a + " #Binary: " + Integer.toBinaryString(a)); System.out.println("-----------------------------------"); a = -20; System.out.println("a = " + a + " #Binary: " + Integer.toBinaryString(a)); a = a >>> 2; //等价于 a >>>= 2; System.out.println("a = " + a + " #Binary: " + Integer.toBinaryString(a));
程序运行结果:
a = 20 #Binary: 10100 a = 5 #Binary: 101 ----------------------------------- a = -20 #Binary: 11111111111111111111111111101100 a = 1073741819 #Binary: 111111111111111111111111111011
几点注意:
1、如果是byte、short、char类型进行移位操作符,则先化为int类型,并且移位后得到的结果也是int类型。对于int型移位操作符右端的移动的位数的二进制表示中,只有低5位是有用的,因为低5位最大可以表示32,而int型最多移动32位。若是对long类型的数值进行移位操作符,那么最终得到的结果将是long类型。
2、如果对byte或short值进行移位操作,那么得到的结果是int类型,如果使用<<=或者>>=或者>>>=赋值操作,可能导致把int类型赋予byte或short类型,而导致截断发生精度损失,例如下面的示例程序
byte b = -1; System.out.println(Integer.toBinaryString(b)); b >>>= 10; //这里相当于把移位后的int类型赋给了byte类型b,发生了截断 System.out.println(Integer.toBinaryString(b)); b = -1; System.out.println(Integer.toBinaryString(b)); System.out.println(b >>> 10); //这里直接显示,不发生截断,所以结果正确
运行结果:
11111111111111111111111111111111 11111111111111111111111111111111 11111111111111111111111111111111 4194303
对于整形十进制数的左移操作相当于操作数乘以2的(移动的位数)次方,如,20<<2,也就等于20乘以2的2次方 = 80
对于整形十进制数的右移操作也就是操作数除以2的(移动的位数)次方,如,20>>2,也就等于20除以2的2次方 = 5,不能整除的情况下,就取结果的整数部分。
相关文章推荐
- Java 移位操作>>,<<,>>> 位逻辑运算符 &, |,~,^
- Java的移位操作(收集+纠正)
- c、java移位操作
- Java的移位操作(收集+纠正)
- Java移位操作>>,>>>与<<
- 用java实现数组的循环逐步移位操作
- java的移位操作详解,左移和右移
- 1,Java的移位操作效果; 2,移位如何实施的; 3, 原码补码反码原理
- Java 移位操作
- java中的移位操作
- java 移位操作
- Java移位操作
- java的移位操作详解,左移和右移
- java中移位操作
- Java移位操作
- java的移位操作详解,左移和右移
- Java中的移位操作
- java基于移位操作实现二进制处理的方法示例
- Java 移位操作
- Java 移位操作