邏輯運(yùn)算符
- &-----邏輯與| ----- 邏輯或! ----- 邏輯非
- &&-----短路與|| ----- 斷路或^ ----- 邏輯異或
a |
b |
a & b |
a && b |
a | b |
a || b |
!a |
a ^ b |
true |
true |
true |
true |
true |
true |
false |
false |
true |
false |
false |
false |
true |
true |
false |
true |
false |
true |
false |
false |
true |
true |
true |
true |
false |
false |
false |
false |
false |
false |
true |
false |
-
區(qū)分 & 與 &&
- 相同點(diǎn)1:
& 與 && 的運(yùn)算結(jié)果相同
- 相同點(diǎn)2:當(dāng)符號左邊是
true 時,,二者都會執(zhí)行符號右邊的運(yùn)算
- 不同點(diǎn):當(dāng)符號左邊是
false 時,& 繼續(xù)執(zhí)行符號右邊的運(yùn)算,。而&& 不再執(zhí)行符號右邊的
-
區(qū)分 | 與 ||
- 相同點(diǎn)1:
| 與 || 的結(jié)果相同
- 形同點(diǎn)2:當(dāng)符號左邊是
false 時,,二者都會執(zhí)行后面的操作
- 不同點(diǎn):當(dāng)符號左邊時
true 時,| 繼續(xù)執(zhí)行符號右邊的運(yùn)算,,而 || 不在執(zhí)行符號右邊的操作
位運(yùn)算符
位運(yùn)算符操作的都是整型的數(shù)據(jù),。
位運(yùn)算符是直接對整數(shù)的二進(jìn)制進(jìn)行計算。
運(yùn)算符 |
運(yùn)算 |
范例 |
<< |
左移 |
3 << 2 = 12 ( 3 * 2 * 2 = 12 ) |
>> |
右移 |
3 >> 1 = 1 ( 3 / 2 = 1 ) |
>>> |
無符號右移 |
3 >>> 1 = 1 ( 3 / 2 = 1 ) |
& |
與運(yùn)算 |
6 & 3 = 2 |
| |
或運(yùn)算 |
6 | 3 = 7 |
^ |
異或運(yùn)算 |
6 ^ 3 = 5 |
~ |
取反運(yùn)算 |
~ 6 = -7 |
|
位運(yùn)算符的細(xì)節(jié) |
<< |
空位補(bǔ)0,,被移除的高位丟棄,,空缺位補(bǔ)0。 |
>> |
被移位的二進(jìn)制最高位是0,,右移后,,空缺位補(bǔ)0;最高位如果是1,,則空缺位補(bǔ)1,。 |
>>> |
被移位二進(jìn)制最高位無論是0或者是1,空缺位都補(bǔ)0,。 |
& |
二進(jìn)制位進(jìn)行& 運(yùn)算,,只有1 & 1時結(jié)果是1,否則是0,。 |
| |
二進(jìn)制位進(jìn)行| 運(yùn)算,,只有0| 0時結(jié)果是0,否則是1,。 |
^ |
相同二進(jìn)制位進(jìn)行^ 運(yùn)算,,結(jié)果是0;( 1 ^ 1 = 0, 0 ^ 0 = 0 ) 不相同二進(jìn)制位^ 運(yùn)算結(jié)果是1,。( 1 ^ 0 = 1, 0 ^ 1 = 1 ) |
~ |
正數(shù)取反,,各二進(jìn)制碼按補(bǔ)碼各位取反 負(fù)數(shù)取反,,各二進(jìn)制碼按補(bǔ)碼各位取反 |
<< :在一定范圍內(nèi),每項(xiàng)左移1位,,相當(dāng)于 * 2
>> : 在一定范圍內(nèi),,每項(xiàng)右移1位,相當(dāng)于 / 2
public class BitTest {
public static void main(String[] args) {
int i = 21;
int j = -21;
System.out.println(" j << 2 = " + ( j << 2 )); // -21 * 2 * 2 = -84
System.out.println(" i << 2 = " + ( i << 2 )); // 21 * 2 * 2 = 84
System.out.println(" i << 3 = " + ( i << 3 )); // 21 * 2 * 2 * 2 = 168
System.out.println(" j >> 2 = " + ( j >> 2 )); // -21 / 2 / 2 = -6
System.out.println(" i >> 2 = " + ( i >> 2 )); // 21 / 2 / 2 = 5
System.out.println(" i >> 3 = " + ( i >> 3 )); // 21 / 2 / 2 / 2 = 2
int m = 12;
int n = 5;
System.out.println(" m & n = " + ( m & n )); // 4
System.out.println(" m | n = " + ( m | n )); // 13
System.out.println(" m ^ n = " + ( m ^ n )); // 9
}
}
數(shù)值之間的交換:
// 交換兩個變量的值
int num1 = 10;
int num2 = 20;
System.out.println(" num1 = " + num1 + " ,num2 = " + num2);
// 方法一:推薦以定義臨時變量的方式進(jìn)行交換
// 好處:適用于多種類型
int temp = num1;
num1 = num2;
num2 = temp;
System.out.println(" num1 = " + num1 + " ,num2 = " + num2);
// 方法二:
// 好處:不用定義臨時變量
// 弊端:①相加操作可能超出存儲范圍②有局限性:只針對數(shù)值類型
int num3 = 10;
int num4 = 20;
num3 = num3 + num4; // num3 = 30;
num4 = num3 - num4; // num4 = 10;
num3 = num3 - num4; // num3 = 20;
System.out.println(" num3 = " + num3 + " ,num4 = " + num4);
// 方法三:實(shí)用位運(yùn)算符
// 好處:不用定義臨時變量
// 弊端:有局限性:只針對數(shù)值類型
int num5 = 10;
int num6 = 20;
num5 = num5 ^ num6;
num6 = num5 ^ num6;
num5 = num5 ^ num6;
System.out.println(" num5 = " + num5 + " ,num6 = " + num6);
|