Java位运算

来源:互联网 发布:淘宝店铺升级咨询电话 编辑:程序博客网 时间:2024/06/07 02:44

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:8byte min:-128byte max:127char size:16char min:0char max:65535short size:16short min:-32768short max:32767int size:32int min:-2147483648int max:2147483647float size:32float min:1.4E-45float max:3.4028235E38long size:64long min:-9223372036854775808long max:9223372036854775807double size:64double min:4.9E-324double 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);} 

结果为:

101010-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);} 

结果为:

32512127268431360-65536655352147418112327672147483647461168601842738790420

说明了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=21111 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=21111 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=15&1=5

计算过程:

0000 0000 0000 0000 0000 0000 0000 01010000 0000 0000 0000 0000 0000 0000 0001---------------------------------------0000 0000 0000 0000 0000 0000 0000 0001=10000 0000 0000 0000 0000 0000 0000 01011111 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=55|(-1)=-1

计算过程:

0000 0000 0000 0000 0000 0000 0000 01010000 0000 0000 0000 0000 0000 0000 0001---------------------------------------0000 0000 0000 0000 0000 0000 0000 0101=50000 0000 0000 0000 0000 0000 0000 01011111 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=-61111 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上调试通过


 

 

 

 


 

 



 


 

 


 

 

 


 

原创粉丝点击