您的位置:首页 > 编程语言 > Java开发

第五天 位运算符以及运算符优先级

2012-08-31 10:42 183 查看

1.1.1.1 位运算符



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



通过3和6两个数字进行与、或、异或的操作:
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*2的0次方+0*2的1次方 +1*2的2次方+1*2的3次方=13
则1101变成十进制后是13
8---10:把八进 制数1340转换成十进制
1340=0*8的0次方+4*8的1次方+3*8的2次方+1*8的3 次方=736
则1340变成十进制后是736
16---10:把十六进制数3A4F转换成十进制
3A4F=15*16的0次方+4*16的1次方+10*16的2次方+3*16的3次方=14927 (十六进制中的A是10,F是15)
二进制与八进制的相互转换:
八进制数 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 运算符的优先级

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



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java学习 运算符
相关文章推荐