逻辑运算符
Boolean类型运算时如下:
-----------------------------------------------------------------------
| 运算符 | 运算 | 范例 | 结果 |
| & | AND(与) | false & true | false |
| | | OR(或) | false | true | true |
| ^ | XOR(异或) | false ^ true | true |
| ! | NOT(非) | !false | true |
| && | AND(短路) | false && true | false | (&&前边的为false,则不会做第二个判断)
| || | OR(短路) | true || false | true | (||前边的为true,则不会做第二个判断)
数值类型运算, 位运算符:
位运算时,是以二进制位来计算
-----------------------------------------------------------------------(可以把1看作true, 0看作false)
| 运算符 | 运算 | 范例 | 结果 |
| & | 位与 | 0110 & 1100 | 0100(全为1时则为1) |
| | | 位或 | 0110 | 1100 | 1110 (有1时则为1) |
| ^ | 位异或 | 0110 ^ 1100 | 1010(相同则0,不同则1) |
| ~ | 按位取反 | ~0110 | 1001(按位取反) |
~是按位取反,因为计算机中操作时补码,所以计算如下:
比如计算 ~3
3为正数所以,计算机中原码,反码,补码相同。
3的补码为
00000000 00000000 00000000 00000011
去反~
补码:11111111 11111111 11111111 11111100
反码:11111111 11111111 11111111 11111100(反码为补码减1)
原码:10000000 00000000 00000000 00000100(-4)
所以结果: ~3 = 4
^ 的特点:一个数对另一个数位异或两次,则该数不变
public static void main(String[] args) {
int a = 10;
int b = 20;
// 某一个数据对另一个数据异或两次, 该数本身不变
System.out.println(a ^ b ^ b);
System.out.println(a ^ b ^ a);
}
结果:
10
20
我们可以使用^位异或做简单 加密 功能,比如传递数据a时,a对b做位异或(a ^ b),然后将结果传给接收方, 接收方再将结果对b进行位异或得到解密后a的值(a ^ b ^ b)。
位异或还可以用于两个数值交换。例如下:方式2
/**
* 实现两个数值交换
* @param args
*/
public static void main(String[] args) {
int a = 10;
int b = 20;
// 方式1:使用第三个变量方式(开发中常用)
int temp = a;
a = b;
b = temp;
System.out.println("a="+a+", b="+b);
// 方式2:使用位异或
a = a ^ b;
b = a ^ b; // b = a ^ b ^ b 相当于 b = a;
a = a ^ b; // b此时已为a了,a此时为a ^ b, 则相当于 a = a ^ b ^ a 则 a = b;
System.out.println("a="+a+", b="+b);
// 方式3:使用变量相加的做法
a = a + b;
b = a - b; // 相当于 b = (a + b) - b, 则 b = a
a = a - b; // 相当于 a = (a + b) - a, 则a = b
System.out.println("a="+a+", b="+b);
// 方式4:一行代码搞定
b = (a + b) - (a = b);
System.out.println("a="+a+", b="+b);
}
网友评论