按位操作符
按位操作符用来操作整数基本数据类型中的单个bit,即二进制位。按位操作符对两个参数中对应的位执进行布尔代数运算。
位操作符
Operator |
Use |
Operation |
& |
op1 & op2 |
运算op1和op2;如果op1和op2都是布尔值,而且都等于true,那么返回true,否则返回false;如果op1和op2都是数字,那么执行位与操作 |
| |
op1 | op2 |
算op1和op2;如果op1和op2都是布尔值,而且有一个等于true,那么返回true,否则返回false;如果op1和op2都是数字,那么执行位或操作 |
^ |
op1 ^ op2 |
运算op1和op2;如果op1和op2不同,即如果有一个是true,另一个不是,那么返回true,否则返回false;如果op1和op2都是数字,那么执行位异或操作 |
~ |
~op2 |
位补,即反转op2的每一位,如果位是1,结果是0,如果位是0,结果是1 |
如果两个输入位里只要有一个是1,操作符与运算&便会生成一个1,否则生成出0,如果两个输入位里只要有一个是1,那么或操作符|便会生成一个1,只要在两个输入位都为0的情况下才会输出0,如果输入位的某一个是1,但不全是1,那么异或操作符^生成一个1。按位非~,也成之于取反操作符,它属于一元操作符,只对一个操作数进行操作,若0生成1,若1生成0.
位与
op1 |
op2 |
Result |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
位或
op1 |
op2 |
Result |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
位异或
op1 |
op2 |
Result |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
按位操作符都可以和等号连用(&=),除了~非,因为~非是一元操作符因此不能与=联用。
移位操作符
移位操作符运算的也是二进制的bit。移位操作符只可用来处理整数类型。左移位操作符<<能按照操作符,能够按照操作符右侧的数字将操作符左边的操作数向左移动(低位补零)
向右操作符>>是将操作数向右移位与左移操作符用法相同。右移操作符会对操作数的符号进行符号扩展,若符号为正,则在高位插入0,若符号为负,则在高位插入1.Java中新增一种无符号右移操作符>>>,它使用“零扩展”:无论正负,都在高位补0。
public class URShift{
public static void main(String [] args){
int i=-1;
System.out.println(Integer.toBinaryString(i));
i>>>=10;
System,out.println(Integer.toBinaryString(i));
long l=-1;
System.out.println(Integer.toBinaryString(l));
l>>>=10;
System.out.println(Integer.toBinaryString(l));
short s=-1;
System.out.println(Integer.toBinaryString(s));
s>>>=10;
System.out.println(Integer.toBinaryString(s));
byte b=-1;
System.out.println(Integer.toBinaryString(b));
b>>>=10;
System.out.println(Integer.toBinaryString(b));
b=-1;
System.out.println(Integer.toBinaryString(b));
System.out.println(Integer.toBinaryString(b>>>10));
}
}
输出
11111111111111111111111111111111
1111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
1111111111111111111111
移动操作符
Operator |
Use |
Operation |
>> |
op1 >> op2 |
将op1的位向右移动,距离由op2决定;左边的位填上最高位(符号位) |
<< |
op1 << op2 |
将op1的位向左移动,距离由op2决定;右边的位填上0 |
>>> |
op1 >>> op2 |
将op1的位向右移动,距离由op2决定;左边的位填上0 |