java位运算符包括
&(与) AND|(或) OR
^(异或) XOR
~(非) NOT
位移运算符包括
>>(右移)
<<(左移)
>>>(右移,左边空出的位以0填充包括符号位)
顾名思义,位运算符用于位运算,那就只能对整型或者字符型进行运算。而除了~(非)是一元运算符之外其他的都为二元运算符。所有位运算都会把值转为二进制进行运算
&(与)
运算规则:0&0=0 0&1=0 1&0=0 1&1=1
即:两位同时为1时,结果才为1,否则为0- int a=(3&5);
- System.out.println(a);
- System.out.println(Integer.toBinaryString(3));
- System.out.println(Integer.toBinaryString(5));
结果打印为
1
011
101
解析:3的二进制为011,5的二进制为101,与操作结果为001。转为十进制是1。
|(或)
运算规则: 0|0=0 0|1=1 1|0=1 1|1=1
即:参加运算的两个对象只要有一个为1,其结果就为1
- int a=(3|5);
- System.out.println(a);
- System.out.println(Integer.toBinaryString(3));
- System.out.println(Integer.toBinaryString(5));
结果打印为
7
011
101
解析:3的二进制位011,5的二进制位101。或操作结果为111。转为10进制为7
^(异或)
运算规则:0^0=0 0^1=1 1^0=1 1^1=0
即:参加运算的两个对象,如果两个个相应位为“异”(进制对应的值不同(如上)),则该位结果为1,否则为0
- int a=(3^5);
- System.out.println(a);
- System.out.println(Integer.toBinaryString(3));
- System.out.println(Integer.toBinaryString(5));
结果打印为
6
(省略29个0) 011 只有补码才能参与运算:
(省略29个0) 101
(省略29个0)110==>
解析:3的二进制位011,5的二进制位101。或操作结果为110。转为10进制为6~(非)
运算规则:~1=0 ~0=1
即:对一个二进制数按位取反,即0变为1,1变为0 (符号位都变)
~运算符的优先级比算数运算符、关系运算符、逻辑运算符和其他运算符都高
<<(左移)
将一个运算符对象的各二进制位全部左移诺干位(左边的二进制位丢弃,右边补0)(符号位是不变的)
操作数每左移一位,相当于该数乘以2
- int a=(3<<2);
- System.out.println(a);
- System.out.println(Integer.toBinaryString(3));
- System.out.println(Integer.toBinaryString(12));
结果打印为
12
11
1100
解析:此运算符的意思就是把3的二进制位全部左移两位,右边补2个0。3的二进制位11,左移两位后,右边补2个0就是1100。1100转为10进制为12。
说到底左移操作就相当于2的2次方×3。 每左移1位次方就增1
>>(右移)
将一个数的各二进制位全部右移诺干位,(负数记得原码转补码再计算) 左边符号位不变其余补0 ,右边丢弃。
操作数每右移一位,相当于该数除以2
- int a=(9>>1);
- System.out.println(a);
- System.out.println(Integer.toBinaryString(9));
- System.out.println(Integer.toBinaryString(4));
结果打印为
4
1001
100
解析:9的二进制为1001,右移1位后,左正数补0,右边丢弃。结果为 0100。转为10进制后为4。
>>>(右移,左边空出的位以0填充包括符号位)
只有补码才能参与运算:(记得负数要转为补码再算)
二进制中最左边的那位代表符号位,0代表正数,1代表负数
正数的二进制:
比如 int num=10;
10转换为二进制==>(在符号位后省略24个0)00001010
原码 00001010
反码
补码 ==>都是一样的
负数的二进制:
比如 int num=-10;
10转换为二进制==>(在符号位后省略24个0)10001010
原码=>10001010
反码==>11110101 负数原码取反时 符号位不变,其余0变1,1变0;=反码;
补码==>11110110 反码+1=补码;
注意:如果是负数的补码想变回原码
公式是1:负数的原码=负数的补码(取反)+1
-10的补码是 11110110(取反)==>10001001+1==>10001010 ==>--10的原码
公式是2:负数的原码=负数的补码-1(再取反)
11-10=?的结果是?
11的补码00001011和-10的补码11110110相加运算后=00000001(相加进位是可以改变符号位)
http://wangwei3.iteye.com/blog/1399340