第五天 位运算符以及运算符优先级
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 关系运算符、逻辑运算符和三元运算符,以及运算符优先级
- swift:高级运算符(位运算符、溢出运算符、优先级和结合性、运算符重载函数)
- c++ 中关于运算符优先级的问题 以及与或问题详解
- 浅谈C/C++中运算符的优先级、运算符的结合性以及操作数的求值顺序
- typeof运算符以及空接合运算符,运算符的优先级
- 浅谈C/C++中运算符的优先级、运算符的结合性以及操作数的求值顺序
- Java中的条件运算符以及运算符的优先级,Java条件语句之 if
- Python按位运算符,字典,运算符优先级的基本总结
- 逻辑运算符、位运算符、移位运算符、三目运算符、运算符的优先级
- (4)javascript的运算符以及运算符的优先级
- 浅谈C/C++中运算符的优先级、运算符的结合性以及操作数的求值顺序
- 浅谈C/C++中运算符的优先级、运算符的结合性以及操作数的求值顺序
- 赋值=, 逗号, ++以及括号运算符优先级例子
- 第03天C语言(03):算术运算符-优先级以及结合性
- 第03天C语言(01):运算符的优先级以及结合性
- 关于C/C++种运算符的优先级,结合性以及操作数的求值顺序
- 运算符和表达式,以及运算符的优先级
- 位运算符 和MySQL运算符的优先级
- 浅谈C/C++中运算符的优先级、运算符的结合性以及操作数的求值顺序(转)for myself
- 浅谈C/C++中运算符的优先级、运算符的结合性以及操作数的求值顺序