逻辑运算符
逻辑运算符只能⽤于 boolean 类型的数据运算,判断 boolean 数据之间的逻辑关系,与、或、⾮。
&(与)、|(或)、!(⾮)、&&(短路与)、||(短路或)
与&
变量1 & 变量2:只有当变量 1 和变量 2 都为 true,结果为 true,否则为 false。 (有一假则为假)
或|
变量1 | 变量2:变量 1 和变量 2 只要有⼀个为 true,结果为 true,否则为 false。 (有一真则为真)
非!
!变量1:若变量 1 为 true,结果为 false,若变量 1 为 false,结果为 true。
异或^
变量相同为false,相反为true
短路与&&
只要符号左边为false,则右边表达式不再执行,直接返回false
短路或||
只要符号左边为true,则右边表达式不再执行,直接返回true
位运算符
&(按位与)、|(按位或)、^(按位异或)、 ~(按位取反) 、<<(左移)、 >>(右移)
1.变量1 & 变量2:先把变量 1 和变量 2 转为⼆进制,每⼀位的数字⼀⼀对应,进⾏⽐较判断,若都为 1,则该位记做 1,否则记做 0。
2.变量1 | 变量2:先把变量 1 和变量 2 转为⼆进制,每⼀位的数字⼀⼀对应,进⾏⽐较判断,只要有⼀ 个为 1,则该位记做 1,否则记做 0。
3.变量1 ^ 变量2:先把变量 1 和变量 2 转为⼆进制,每⼀位的数字⼀⼀对应,进⾏⽐较判断,相同记做 0,不同记做 1。
4.<<(左移):左边最高数值位丢弃,右边空缺补0 :将要移动的数扩大2^n n:就是移动的位数
计算机中运算的是二进制的补码
3: 补码:00000000 00000000 00000000 00000011
反码:00000000 00000000 00000000 00000011
原码:00000000 00000000 00000000 00000011
~3: 补码:11111111 11111111 11111111 11111100
反码:11111111 11111111 11111111 11111011
原码:10000000 00000000 00000000 00000100
~3=-4
3>>1:补码:00000000 00000000 00000000 00000001
反码:00000000 00000000 00000000 00000001
原码:00000000 00000000 00000000 00000001
3>>1=1
-4:原码:10000000 00000000 00000000 00000100
反码:11111111 11111111 11111111 11111011
补码:11111111 11111111 11111111 11111100
-4>>1:补码:11111111 11111111 11111111 11111110
反码:11111111 11111111 11111111 11111101
原码:10000000 00000000 00000000 00000010
-4>>1=-2
-4>>>1:补码:01111111 11111111 11111111 11111111
反码01111111 11111111 11111111 11111111
原码:01111111 11111111 11111111 11111111
-4>>>1=2147483646
6: 补码:00000000 00000000 00000000 00000110
反码:00000000 00000000 00000000 00000110
原码:00000000 00000000 00000000 00000110
3&6:补码:00000000 00000000 00000000 00000010
反码:00000000 00000000 00000000 00000010
原码:00000000 00000000 00000000 00000010
3&6=2
3|6补码:00000000 00000000 00000000 00000111
反码:00000000 00000000 00000000 00000111
原码:00000000 00000000 00000000 00000111
3|6=7
3^6补码:00000000 00000000 00000000 00000101
反码:00000000 00000000 00000000 00000101
原码:00000000 00000000 00000000 00000101
3^6=5
位运算:
* * <<:左边最高数值位位左移不包括符号位,右边空缺补0;乘以2^n
* * >>:正数:向右移动,左边空缺补补0除以2^n
* * 负数:向右移动,左边空缺补补1
* * >>>:无符号右移
* * 面试题 :写一个高效算法计算2*8 :2*2^3=2<<3
System.out.println("2<<3:"+(2<<3));
2:补码: 00000000 00000000 00000000 00000010
反码: 00000000 00000000 00000000 00000010
原码: 00000000 00000000 00000000 00000010
2<<3:补码:(000)00000000 00000000 00000000 00010000
反码: (000)00000000 00000000 00000000 00010000
原码: (000)00000000 00000000 00000000 00010000
2<<3=2*2^3=16
使用三目运算符求两数最大值
格式:
(关系表达式)?表达式1:表达式2
int a=3, b=4;
int max;
System.out.println((a>b)?(max=a):(max=b));