No. |
逻辑运算符 |
描述 |
1 |
& |
按位与 |
2 |
| |
按位或 |
3 |
^ |
异或(相同0, 不同为1) |
4 |
~ |
取反 |
5 |
<< |
左位移 |
6 |
>> |
右位移 |
7 |
>>> |
无符号有位移 |
常用位运算符 以及描述见上表。 需要指出的是上面的操作是针对2进制数
public class OperateDemo1 {
public static void main(String[] args){
operate();
if(10==10||10/0==0){ //短路 不会出错
System.out.println("条件满足") ;
}
if(10==10|10/0==0){ // 非短路 会报异常
System.out.println("条件满足") ;
}
}
/**
* 为了方便看出位运算符的作用,数据转为了 二进制输出
*/
static void operate(){
boolean b = false;
int x = 3;
int y = 6;
System.out.printf("%s & %s = %s\n", Integer.toBinaryString(x),Integer.toBinaryString(y), Integer.toBinaryString(x&y));
System.out.printf("%s | %s = %s\n", Integer.toBinaryString(x),Integer.toBinaryString(y), Integer.toBinaryString(x|y));
System.out.printf("%s ^ %s = %s\n", Integer.toBinaryString(x),Integer.toBinaryString(y), Integer.toBinaryString(x^y));
System.out.printf("b = %b, !b = %b\n", b, !b);
// 3的二进制数据: 00000000 00000000 00000000 00000011
// 6的二进制数据: 00000000 00000000 00000000 00000110
//与: 00000000 00000000 00000000 00000010
//或: 00000000 00000000 00000000 00000111
//或: 00000000 00000000 00000000 00000101
}
}
//结果
11 & 110 = 10
11 | 110 = 111
11 ^ 110 = 101
b = false, !b = true
条件满足
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.lyne.chapter3.OperateDemo1.main(OperateDemo1.java:11)
可以看到 对于与操作,是将 对应位置上的两个数字进行计算 可以因为 0 =false ; 1 =true, 那么 0&1 = 0; 0&0 = 0; 1&1 =1; 来获取结果数据。最终在转化为10进制数据。
那么接下来聊一聊左移“<<” 以及 右移“>>”两种操作。
左移操作是将运算数的二进制码真题左移指定位数, 左移之后的空位使用0来填充。
右移操作“>>” 是将运算符的二进制码整体右移,右移之后空出来的位置以符号填充,如果是正整数使用“0”,反之用“1”。
public class OperateDemo1 {
public static void main(String[] args){
operate();
}
/**
* 为了方便看出位运算符的作用,数据转为了 二进制输出
*/
static void operate(){
// 3的二进制数据: 00000000 00000000 00000000 00000011
int x = 3;
// -3的二进制数据: 11111111 11111111 11111111 11111101
int y = -3;
// 000000 00000000 00000000 0000001100
System.out.printf("%d左移2位之后的内容:%d\n",x,(x<<2));
System.out.printf("%d右移2位之后的内容:%d",y,(y>>2));
}
}
//结果
//3左移两位之后的内容:12
//-3右移两位之后的内容:-1
分析图如下:
至于结果,大家可以自己转化一下。