1. 程式人生 > 其它 >C++中的與、或、異或、取反和左移等運算子解析

C++中的與、或、異或、取反和左移等運算子解析

技術標籤:c++

前言: 與、或、非運算子在實際中分為:按‘位’和‘邏輯’
按位主要針對二進位制,邏輯結果為true 或 false

邏輯運算子

與 &&

表示邏輯與
邏輯與的意思和and的意思一樣的。
當運算子兩邊的表示式的結果都為true時,整個運算結果才為true。
只要有一方為false,則結果為false。
邏輯運算的兩個條件可以是除了數字以外的其他語句
12&&8 =1
3&&-1 =1
5&&0 =0

或 ||

表示邏輯或
邏輯或,是邏輯運算子, “邏輯或”相當於“或者”,當兩個條件時,其中有任一個條件滿足,“邏輯或”的運算結果就為“真”

12||1 =1 12||0 =1 0||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

右移 (>>)

向右位移,就是把尾數去掉位數,

例如:5 >> 1,5的二進位制是:0101,後面去掉 1位變為 0010
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