下面這個例子展現了 C 說話中四種位元運算子的利用方式,請注意註解中的履行成果 c,和原始數值 a 與 b 對照,就可知道這些運算子的效果。
邏輯運算NOT
>=
!
到這裡你可能會問,這些位元運算有甚麼用處呢?其實用途很多,例如說,例用 AND運算子「a 與 b 均為 1 的時刻才會 1」的性質,換言之「如果 b 為 0 的話,a 非論多少、a AND b 必定為 0」,另外一方面假如 b 為 1,那麼 a AND b 就等於是 a 的原值,操縱這個性質,就能夠以 b 做為 a 的遮罩(mask),或稱做過濾器。
指定運算
對照運算大於等於
位元運算AND
將數值的位元向左移動n個位元。向左移動後,超越貯存範圍的數字捨去,右邊位元則補上0。
11
=
AND 的運算的一個常見用途則是用在權限辦理上,所謂利用者 a 對物品 b 的權限,應當是「 a 有權限使用物品、而 b 剛也有開放被使用的權限」的時辰,a 才得以利用 b 物品,如果 a 有利用物品的權限但是 b 不是公然物品,那麼 a 沒法使用 b 物品,換言之,假如 b 是公開物品,可是 a 沒有利用任何物品的權限(好比權限等級只是訪客品級),a 也不克不及利用 b 物品,所以很顯然地「a 是否有權限利用物品 b」是一個 AND 運算,舉個例子來講:
-
邏輯運算OR
位元左移
<
負號
printf("%x",a); // 顯示 cd printf("%X",a); // 顯示 CD
對照特別的是 XOR運算,他的特點是「a和b分歧的時候 a^b 才 1,不然 a^b 必為 0」,所以 (a^b)^b 等於 a 自己,以影象處置來說,A影像對 B 影像做 XOR,會把 B 影象堆疊在 A 之上(但是部份像素會反白),然後再對同一張 B 影象做一次 XOR 則可以或許恢復 A 的原貌,所以 XOR 可以做到影像的「臨時」重疊 (或移動中的影象),夙昔常常用於簡單動畫、滑鼠游標或輔助線的顯示上翻譯
+
如這個例子所示,我們所謂的2進位/10進位/16進位意思就是以2/10/16為底,所以205這個數字以16進位應當默示成 cd,以 2 進位應該表示成 11001101,把 0~15之間的數以2進位/10進位/16進位列出以下表,其中16進位(Hex)以 a~f 代表 10~15。
是將數值的位元向右移動n個位元翻譯向右移動後,超出儲存規模的數字捨去,而左側多出的位元就補上0翻譯
/
0x9527(16進位) = (二進位) 0000 0000 0000 0000 1001 0101 0010 0111 ( 0 0 0 0 9 5 2 7 } 0xff00(16進位) = (二進位) 0000 0000 0000 0000 1111 1111 0000 0000 ( 0 0 0 0 f f 0 0 )
典範:
unsigned int x = 0x9527; unsigned int y = 0xff00; unsigned int q = x & y; printf("%x AND %x = %x ", x, y, q);
履行結果
9527 AND ff00 = 9500
1
減法
比較運算小於
*
所以我們只要一看到一個以16進位的數值,很直覺地就能夠知道這個數字的各 bit 為何,因此在程式中以16進位來表示要進行位元運算(bitwise operation)的數字長短常利便的,不然就得換算了。
電路中最基本的邏輯運算子以下所列,可說是工程人員都耳熟能詳地,假定有 A 和 B 兩個 bit,即它們的值只有 0 和 1 兩種,那麼 A AND B 只有在兩者皆為 1 的時刻才會 1,A OR B 則是二者有ㄧ者為1的時候就會1,而A XOR B 是 A 與 B 不相等的時候為 1,NOT 則是純真地 0 變 1、1 變 0翻譯
|
要在2進位/10進位/16進位之間換算,其實最好的工具就是 Windows 內附的小算盤(calc.exe),如下圖,起首在檢視選單下,將小算盤切換到「工程型」,然後這個程式就會多出下圖密密麻麻的按鈕,接著選擇你要輸入數字的數值進制並且輸入數值,例如我要輸入10進位的205,所以我選擇了「十進位」然後輸入205,然後只要點選其他的數值進制,顯示的數字就會釀成其它進制,例如在圖中萬國翻譯公司點選十六進制,205 就變成了CD,點選了二進位,205就釀成了11001101。
8
意義 | 運算子 | 典範 | a | b | c |
AND | & | c=a & b | 1100 1101 | 1001 1110 | 1000 1100 |
OR | | | c= a | b | 1100 1101 | 1001 1110 | 1101 1111 |
XOR | ^ | c= a ^b | 1100 1101 | 1001 1110 | 0101 0011 |
NOT | ~ | c =~a | 1100 1101 | 0011 0010 |
9
位元右移
10
比較運算不等於
除法
205 (10進位) = 2 x 102 + 0 x 101 + 5 x 100
= c x 161 + d x 100 (16進位)
= 1x27 + 1x26 + 0x25 + 0x24 + 1x23 + 1x22 + 0x21 + 1x20 (2進位)
在C 語言當中沒有二進位默示法與顯示格式,所以你沒辦法在程式東打一大串 1001010101010101 以二進位來指定命值,然則有16進位的暗示法,也就是說
位元運算XOR
<<
( )
某檔案 7-11.doc 的權限遮罩: 1111 1100 意義 111x xxxx →o wner 可讀寫刪 xxx1 11xx → 同group可讀寫刪 xxxx xx00 → 訪客不可讀不成寫
所以
++
6
||
#include <stdio.h> void main(void) { // 以下劃分以進位與進位表示法來指定 a 與 b: unsigned char a = 205; // 即 1100 1101翻譯社 相當於 a = 0xcd unsigned char b = 0x9e; // 即 1001 1110, 相當於 b = 158 // 試用 AND 運算子,得到 c = 0x8c 即 1000 1100 unsigned char c = a & b; printf("%x AND %x = %x ", a翻譯社 b, c); // 試用 OR 運算子,獲得 c = 0xdf 即 1101 1111 c = a | b; printf("%x OR %x = %x ", a翻譯社 b翻譯社 c); // 試用 XOR 運算子,得到 c = 0x53 即 0101 0011 c = a ^ b; printf("%x XOR %x = %x ", a, b, c); // 試用 NOT 運算子,得到 c = 0x32 即 0011 0010 c = ~a; printf("NOT %x = %x "翻譯社 a, c); }
履行效果
cd AND 9e = 8c cd OR 9e = df cd XOR 9e = 53 NOT cd = 32
當
-
在之前
優先順序 除 AND 運算之外,OR 運算的特質在於「a 與 b 只要有 1 者為 1 則 a | b 必定為 1」,若 b 為 0,則 a | b 則為 a 的原值,所以可說 OR 運算有「重疊」或「加法」的結果,相對於 AND 運算用於剪裁影象或判定權限,OR 運算則用於「影像堆疊」或「付與權限」,雷同地,NOT運算可用於「影像反白」或「取得 解除權限」或「獲得遮罩」影像翻譯 a = 0xcd; // 和 a = 205 是一樣的
而 printf( ) 或其他的字串花式化與顯示函式都有 16 進位的顯示格式,就是 %x (小寫顯示) 或 %X (大寫顯示) 格式字串環節字,例如: 位元運算OR > |
邏輯運算AND 2 說明 前提運算子 5 ^ 遞減運算 <<位元運算子 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
小括號 >> <= 遞增運算
運算子優先按次 4
3 為甚麼要學習2進位與16進位呢?從這個表上你可以清晰地見到16進位每個數字就恰恰好代表了 4 bits,例如 0xcd = 1100 1101: |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
== |
if ( a != 0 && b != 0) { ... } // 連氣兒兩個 && 是邏輯判定的 AND if ( a && b ) { ... } // 同上 if ( a & b ) { ... } // 這是 AND 位元運算,假如 a bitwise-AND b 的成績不為零... char * ptr = & a; // & 當一元運算子的時刻是對變數取位址 總之 C/C++有這四種位元運算子,可用於任何資料型別,意即該型別有幾個 bits 就做幾個 bits 的運算: |
OpenJohn 對於7 -11.doc 的權限 = AND 成果: 0001 0000 意義 000x xxxx → not owner xxx1 00xx → 可讀此文件 xxxx xx00 → 弗成讀寫此文件 這個技巧遍及地被各功課系統運用於使用者登入權限 與 檔案/目錄 存取權限的辦理與判讀。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||
!= 餘數
&& 比力運算大於 unsigned char a = 205 (十進位) = 1100 1101 (二進位) unsigned char b = 158 (十進位) = 1001 1110 (二進位) a AND b: c=a & b = 140 (十進位) = 1000 1100 (二進位) 在這個例子傍邊的 & 運算子就是 C/C++ 的 AND 位元運算子,從這個例子可以看到 & 運算子劃分對 unsigned char 的 8 bits 做了 AND 位元運算。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
位元的AND運算非常地常用,鄙人圖中的黑白點陣圖(bitmap)影像,每一個 bit 代表一個是非像素(pixel),所以每個 byte 代表 8 bits,你可以看到左邊的影象是個 V 字,右側的遮罩影象是個圓形。把這兩個影像每個 byte 做 AND 的成果以下所示,等於是把 V 影像剪裁(crop)在圓形局限之內了,所以 V 的兩支銳角不見了。操縱這個技能,可以用 AND 去裁切掉影像不要的部份翻譯 -- |
請注意 2進位/10進位/16進位只是(撰寫程式碼)的時刻表示數值的格式,不是電腦貯存數值的格式。電腦儲存數值必然是 bit by bit 的、也可以說一定是 2 進位的,可是認識不同進位之間的換算與默示法,仍然對寫程式大有幫助。 |
運算子 以下文章來自: https://blog.xuite.net/tsai.oktomy/program/67226142-%E4%BD%8D%E5%85%83%E9%81%8B%E7%AE%97%E5%AD%90+%2有關各國語文翻譯公證的問題歡迎諮詢萬國翻譯公司02-23690931 文章標籤
全站熱搜
|
留言列表