C++中的與、或、異或、取反和左移等運算子解析
技術標籤:c++
前言: 與、或、非運算子在實際中分為:按‘位’和‘邏輯’
按位主要針對二進位制,邏輯結果為true 或 false
邏輯運算子
與 &&
表示邏輯與
邏輯與的意思和and的意思一樣的。
當運算子兩邊的表示式的結果都為true時,整個運算結果才為true。
只要有一方為false,則結果為false。
邏輯運算的兩個條件可以是除了數字以外的其他語句
12&&8 =1
3&&-1 =1
5&&0 =0
或 ||
表示邏輯或
邏輯或,是邏輯運算子, “邏輯或”相當於“或者”,當兩個條件時,其中有任一個條件滿足,“邏輯或”的運算結果就為“真”
非 !
! 運算子被稱為邏輯非運算子,執行邏輯 NOT 操作。
它可以反轉一個運算元的真值或假值。
如果表示式為 true,那麼 ! 運算子將返回 false
如果表示式為 false,則返回 true。
二進位制中
與(&)
對於所計算的兩個數字,按二進位制位進行“與”運算。
具體運算規則:
0&0=0;
0&1=0;
1&0=0;
1&1=1;
兩位同為“1”時,結果才為“1”,否則結果為0
例如:3&5
即0000 0011
& 0000 0101
= 0000 0001
3&5的值為1。
或(|)
對於所計算的兩個數字,按二進位制位進行“或”運算。
0|0=0;
0|1=1;
1|0=1;
1|1=1;
參與運算的兩個物件只要有一個為1,其值為1。
例如:3|5
0000 0011
| 0000 0101
= 0000 0111
3|5的值為7。
取反(~)
參與運算的資料,按二進位制位進行“取反”運算。
運算規則:
~1=0;
~0=1;
對一個二進位制數按位取反,即將0變1,1變0。
異或(^)
對於所計算的兩個資料,按二進位制位進行“異或”運算。
運算規則:
0^0=0;
0^1=1;
1^0=1;
1^1=0;
如果兩個相應值不同,結果為1,否則為0。
例如:9^5
00001001
^00000101
=00001100
9^5結果為12
任何數異或 0 得到的值不變:
a^0 = a
右移 (>>)
向右位移,就是把尾數去掉位數,
0010轉化成十進位制就是 2。
移位運算包含“邏輯移位”(logical shift)和“算術移位”(arithmetic shift)。
邏輯移位:移出去的位丟棄,空缺位用 0 填充。
算術移位:移出去的位丟棄,空缺位用“符號位”來填充,所以一般用在右移運算中。
常用運算:(二進位制賦值、取值、左移、右移、求餘數、向上取整、向下取整)
1.賦值1 -> 或運算(|)
例如:40 | (1<<1) = 42
0010 1000
| 0000 0010
------------------
0010 1010
2.賦值0 -> 與非運算(&~)
例如: 42 & ~(1<<1) = 40
0010 1010 & ~0000 0010
==》
0010 1010
& 1111 1110
---------------
0010 1000
3.取值 -> 與運算(&)
例如:42 & 1<<1 = 2
0010 1010
& 0000 0010
-----------------
0000 0010
4.乘以2 -> 左移一位( << 1)
例如:43 * 2 = 43 << 1 = 86
0010 1011 >> 0101 0110 = 86
5.除以2 -> 右移一位( >> 1)
例如:43 / 2 = 43 >> 1
0010 1011 >> 0001 0101 = 21
6.除以2求餘數 -> 與1( &1)
例如:43 % 2 = 43 & 1 = 1
0010 1011
& 0000 0001
---------------
0000 0001