简介
位运算是二进制运算。
Java中基本数据类型:
这里包括了float和double两个浮点型,不予考虑,因为位运算是针对整型的。进行位操作时,除long型外,其他类型会自动转成int型,转换之后,可接受操作数长度为32。
byte和char进行移位运算时不会发生错误,并且均按照整型进行计算,当计算结果超出byte或是char所能表示的范围时则进行相应的转换(分别输出了结果-8和?)。
Java位运算对long、int、short、char和byte,位运算符具体如下表:
左移位(<<)
程序:
public class LeftMoving{
public static void main(String[] args){
System.out.println("5<<3="+(5<<3));
}
}
输出结果:
5<<3=40
计算过程:
0000 0000 0000 0000 0000 0000 0000 0101 ? 5
0000 0000 0000 0000 0000 0000 0010 1000 ? 40
右移位(>>)
正数
正数则高位补0。
程序:
public class PlusRightMoving{
public static void main(String[] args){
System.out.println("5>>1="+(5>>1));
}
}
输出结果:
5>>1=2
计算结果:
0000 0000 0000 0000 0000 0000 0000 0101 ? 5
0000 0000 0000 0000 0000 0000 0000 0010 ? 2
负数
负数则高位补1。
程序:
public class NegativeRightMoving{
public static void main(String[] args){
System.out.println("-5>>1="+(-5>>1));
}
}
输出结果:
-5>>1=-3
计算结果:
1111 1111 1111 1111 1111 1111 1111 1011 ? -5
1111 1111 1111 1111 1111 1111 1111 1101 ? -3
计算机,负数以其正值的补码形式表达。
无符号右移位(>>>)
程序:
public class UnsignedRightMoving{
public static void main(String[] args){
System.out.println("-5>>>1="+(-5>>>1));
}
}
输出结果:
-5>>>1=2147483645
计算过程:
1111 1111 1111 1111 1111 1111 1111 1011 ? -5
0111 1111 1111 1111 1111 1111 1111 1101 ? 2147483645
位运算中的操作数
在进行移位运算时要注意整型和长整型在内存中的位数(整型是32位,长整型是64位),如果移位操作数超出了该位数则取模计算,例如:int型数据是32位的,如果左移35位是什么结果?
程序:
public class LeftMoving{
public static void main(String[] args){
System.out.println("5<<35="+(5<<35));
}
}
输出结果:
5<<35=40
该结果与5<<3完全相同。
无论正数、负数,它们的右移、左移、无符号右移 32位都是其本身,比如 -5<<32=-5、-5>>32=-5、-5>>>32=-5。
一个有趣的现象是,把 1 左移 31 位再右移 31位,其结果为 -1。
计算过程:
0000 0000 0000 0000 0000 0000 0000 0001
1000 0000 0000 0000 0000 0000 0000 0000
1111 1111 1111 1111 1111 1111 1111 1111
程序:
输出结果:
计算过程:
程序:
输出结果:
计算过程:
程序:
输出结果:
计算过程:
程序:
输出结果:
计算过程: