Java位运算

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上调试通过


 

 

 

 


 

 



 


 

 


 

 

 


 

posted @ 2013-01-14 15:03  心意合一  阅读(332)  评论(0编辑  收藏  举报