Java的位运算(bitwise operators)直接对整数类型的位进行操作:
public static void main(String[] args){ System.out.println("byte size:"+Byte.SIZE); System.out.println("byte min:"+Byte.MIN_VALUE); System.out.println("byte max:"+Byte.MAX_VALUE); System.out.println("char size:"+Character.SIZE); System.out.println("char min:"+Integer.valueOf(Character.MIN_VALUE)); System.out.println("char max:"+Integer.valueOf(Character.MAX_VALUE)); System.out.println("short size:"+Short.SIZE); System.out.println("short min:"+Short.MIN_VALUE); System.out.println("short max:"+Short.MAX_VALUE); System.out.println("int size:"+Integer.SIZE); System.out.println("int min:"+Integer.MIN_VALUE); System.out.println("int max:"+Integer.MAX_VALUE); System.out.println("float size:"+Float.SIZE); System.out.println("float min:"+Float.MIN_VALUE); System.out.println("float max:"+Float.MAX_VALUE); System.out.println("long size:"+Long.SIZE); System.out.println("long min:"+Long.MIN_VALUE); System.out.println("long max:"+Long.MAX_VALUE); System.out.println("double size:"+Double.SIZE); System.out.println("double min:"+Double.MIN_VALUE); System.out.println("double max:"+Double.MAX_VALUE); }
结果为:
byte size:8 byte min:-128 byte max:127 char size:16 char min:0 char max:65535 short size:16 short min:-32768 short max:32767 int size:32 int min:-2147483648 int max:2147483647 float size:32 float min:1.4E-45 float max:3.4028235E38 long size:64 long min:-9223372036854775808 long max:9223372036854775807 double size:64 double min:4.9E-324 double max:1.7976931348623157E308
因为float和double为浮点类型,
故可进行位运算的数据类型包括byte、char、short、int和long
数据类型 | 所占位数 | 最小值 | 最大值 |
byte | 8 | 1000 0000=-27=-128 | 01111 1111=27-1=127 |
char | 16(char无符号位) | 0000 0000 0000 0000=0 | 1111 1111 1111 1111=65535 |
short | 16 | -215=-32768 | 215-1=32767 |
int | 32 | -231=-2147483648 | 231-1=2147483647 |
long | 64 | -263=-9223372036854775808 | 263-1=9223372036854775807 |
public static void main(String[] args){ System.out.println(10<<32); System.out.println(10>>32); System.out.println(10>>>32); System.out.println(-10<<32); System.out.println(-10>>32); System.out.println(-10>>>32); }
结果为:
10 10 10 -10 -10 -10
int类型的数据<<32,>>32,>>>32都为本身
public static void main(String[] args){ byte b = 127; System.out.println(b<<8); System.out.println(b<<32); char c = 65535; System.out.println(c<<12); System.out.println(c<<16); System.out.println(c<<32); short s = (short)32767; System.out.println(s<<16); System.out.println(s<<32); int i = 2147483647; System.out.println(i<<32); long l = 20l; System.out.println(l<<60); System.out.println(l<<64); }
结果为:
32512 127 268431360 -65536 65535 2147418112 32767 2147483647 4611686018427387904 20
说明了byte,char,short在位移运算之前都会转换成int类型,然后再进行位移运算
位运算符具体如下表:
运算符 | 说明 |
<< | 左移位,在低位处补0 |
>> | 右移位,若为正数则高位补0,若为负数则高位补1 |
>>> | 无符号右移位,无论正负都在高位补0 |
& | 按位与,对应位都为1时该位为1,否则0 |
| | 按位或,对应位都为0时该位为0,否则1 |
~ | 按位非 |
^ | 按位异或,对应位相等该位为0,不等为1。 |
<<= | 左移位赋值。 |
>>= | 右移位赋值。 |
>>>= | 无符号右移位赋值。 |
&= | 按位与赋值。 |
|= | 按位或赋值。 |
^= | 按位异或赋值。 |
左位移(<<):
程序:
public static void main(String[] args) { System.out.println("5<<3="+(5<<3)); }
运行结果:
5<<3=40
计算过程:
0000 0000 0000 0000 0000 0000 0000 0101 --------------------------------------- 0000 0000 0000 0000 0000 0000 0010 1000=40
右位移(>>):
程序:
public static void main(String[] args) { System.out.println("5>>1="+(5>>1)); System.out.println("-5>>1="+(-5>>1)); }
运行结果:
5>>1=2 -5>>1=-3
计算过程:
0000 0000 0000 0000 0000 0000 0000 0101 --------------------------------------- 0000 0000 0000 0000 0000 0000 0000 0010=2 1111 1111 1111 1111 1111 1111 1111 1011(-5:|5|的反码+1) --------------------------------------- 1111 1111 1111 1111 1111 1111 1111 1101=-3
右位移(>>>):
程序:
public static void main(String[] args) { System.out.println("5>>>1="+(5>>>1)); System.out.println("-5>>>1="+(-5>>>1)); }
运行结果:
5>>>1=2 -5>>>1=2147483645
计算过程:
0000 0000 0000 0000 0000 0000 0000 0101 --------------------------------------- 0000 0000 0000 0000 0000 0000 0000 0010=2 1111 1111 1111 1111 1111 1111 1111 1011 --------------------------------------- 0111 1111 1111 1111 1111 1111 1111 1101=2147483645
按位与(&):
程序:
public static void main(String[] args) { System.out.println("5&1="+(5&1)); System.out.println("5&1="+(5&(-1))); }
运行结果:
5&1=1 5&1=5
计算过程:
0000 0000 0000 0000 0000 0000 0000 0101 0000 0000 0000 0000 0000 0000 0000 0001 --------------------------------------- 0000 0000 0000 0000 0000 0000 0000 0001=1 0000 0000 0000 0000 0000 0000 0000 0101 1111 1111 1111 1111 1111 1111 1111 1111 --------------------------------------- 0000 0000 0000 0000 0000 0000 0000 0101=5
按位或(|):
程序:
public static void main(String[] args) { System.out.println("5|1="+(5|1)); System.out.println("5|(-1)="+(5|(-1))); }
运行结果:
5|1=5 5|(-1)=-1
计算过程:
0000 0000 0000 0000 0000 0000 0000 0101 0000 0000 0000 0000 0000 0000 0000 0001 --------------------------------------- 0000 0000 0000 0000 0000 0000 0000 0101=5 0000 0000 0000 0000 0000 0000 0000 0101 1111 1111 1111 1111 1111 1111 1111 1111 --------------------------------------- 1111 1111 1111 1111 1111 1111 1111 1111=-1
按位非(~):
程序:
public static void main(String[] args) { System.out.println("~5="+(~5)); System.out.println("~(-3)="+(~(-3))); }
运行结果:
~5=-6 ~(-3)=2
计算过程:
0000 0000 0000 0000 0000 0000 0000 0101 --------------------------------------- 1111 1111 1111 1111 1111 1111 1111 1010=-6 1111 1111 1111 1111 1111 1111 1111 1101 --------------------------------------- 0000 0000 0000 0000 0000 0000 0000 0010=2
左位移赋值(<<=):
程序:
public static void main(String[] args) { int a = 5; a >>= 1; System.out.println(a); }
运行结果:
2
计算过程:
0000 0000 0000 0000 0000 0000 0000 0101 --------------------------------------- 0000 0000 0000 0000 0000 0000 0000 0010=2
先计算,后赋值
注:
所有代码在jdk1.5上调试通过