1.1.1.1 位运算符<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

在Java中所有的数据都是以二进制数据的形式进行运算的,即如果是一个int型变量,要采用位运算时则必须将其变为二进制数据。每一位二进制进行与、或、异或操作的结果:

通过36两个数字进行与、或、异或的操作:

class OperatorDemo15{

public static void main(String[] args) {

int x = 3; //3的二进制:00000000 00000000

00000000 00000011

int y = 6; //6的二进制:00000000 000000000

00000000 00000110

System.out.println(x & y); //与的操作结果:00000000 00000000

00000000 00000010

System.out.println(x | y); //或的操作结果:00000000 00000000

00000000 00000111

System.out.println(x ^ y); //异或操作结果:00000000 00000000

00000000 00000101

}

}

运行结果:

2

7

5

以上程序分别进行了与、或、异或的操作,下面为读者讲解具体的操作流程。3对应的二进制数据为11,但是在Java中整型数据的长度为32位,所以前面要补上29个0,所以结果为00000000 00000000 00000000 00000011,6对应的二进制数据为00000000 00000000 00000000 00000110,计算的过程如图:

这是我找的进制转换的资料:

10进制转换成其他的都是除以要转换成的那个数,也就是说转换成二进制的就除以2 转换成八进制的就除以8,转换成十六进制的就除以16,然后倒取余数。具体例题如下

10---2:把20转换成二进制

20/2=10..........余数为0

10/2=5...........余数为 0

5/2=2............余数为1

2/2=1............余数为0

1/2=0............余数为1

20 成二进制后是10100

  10---8:把20转换成八进制

20/8=2...........余数为 4

2/8=0............余数为2

20转换成八进制后是24

  10---16:把20转换成十六进 14

20/16=1..........余数为4

1/16=0...........余数为1

20转换成十六进制后是14

  2---10:把二进制数1101转换成十进制

1101=1*20次方+0*21次方 +1*22次方+1*23次方=13

1101变成十进制后是13

  8---10:把八进 制数1340转换成十进制

1340=0*80次方+4*81次方+3*82次方+1*83 次方=736

1340变成十进制后是736

  16---10:把十六进制数3A4F转换成十进制

3A4F=15*160次方+4*161次方+10*162次方+3*163次方=14927 (十六进制中的A10F15

  二进制与八进制的相互转换:

八进制数   0      1     2     3      4      5      6      7

二进制数 000    001   010    011    100    101    110    111

二进制与十六进制的相互转换:

十六进制   0     1     2     3      4      5      6      7     B 

二进制数  0000   0001  0010  0011   0100   0101   0110   0111  1011

晕菜了。为什么1+1=2?唉,无解啊。

在计算的数据表示中只定义了正数的表示形式,并没有定义负数的表示形式,所以,负数一般都用补码的形式表示,正数的原码、反码、补码都相同,负数的反码是除符号位为1外,其他位全取反:补码就是“反码+1”。(反码是:原码+1,原码是:整数绝对值的2进制)

求出负数的反码:

class OperatorDemo16{

public static void main(String[] args) {

int x = -3;

System.out.println(x + "的反码是:" + ~x);

}

}

运行结果:

-3的反码是;2

Java中也提供了左移“<<”及右移“>>”两种操作。左移操作是将运算数的二进制码集体左移指定位数,左移之后的空位使用0来填充,如下面代码所示:

左移操作:

class OperatorDemo17{

public static void main(String[] args) {

int x = 3;

System.out.println(x + "左移两位,结果是:" + (x<<2));

}

}

运行结果:

3左移两位,结果是:12

执行过程:

右移操作“>>”是将运算数的二进制码整体右移,右移之后空出来的位置以符号位填充。如果是正数使用0填充,如果是负数则使用1填充。

右移操作:

class OperatorDemo18{

public static void main(String[] args) {

int x = 3;

int y = -3;

System.out.println(x + "右移两位,结果是:" + (x>>2));

System.out.println(y + "右移两位,结果是:" + (y>>2));

}

}

运行结果:

3右移两位,结果是:0

-3右移两位,结果是:-1

执行过程:

Java中提供了无符号的右移操作符“>>>”,使用此操作将以0填充空出来的位。

无符号右移:

class OperatorDemo19{

public static void main(String[] args) {

int x = 3;

int y = -3;

System.out.println(x + "无符号右移两位,结果是:" + (x>>>2));

System.out.println(y + "无符号右移两位,结果是:" + (y>>>2));

}

}

运行结果:

3右移两位,结果是:0

-3右移两位,结果是:1073741823

执行过程:

对于位操作只适用于byte、short、int、char、long、类型,而且位操作之后原始的操作内容并不会发生任何的改变。

1.1.1.2 运算符的优先级

数字越小表示优先级越高: