close

中翻越南語

下面這個例子展現了 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進位的暗示法,也就是說翻譯公司可以把你要運算的位元每4個為一組,以一個16進位的數字默示。C 語言的16進位表示法就是在數值前加上 0x 前綴字,編譯器變知道這個數值是16進位不是10進位,例如:

位元運算XOR

<<

而 C/C++ 的位元處理運算子也是如此,分歧的是這些運算子可以一次處置懲罰多個位元,例如 unsigned char 有 8 bits,那麼:

( )

某檔案 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

翻譯公司的資料不止 1 byte (8 bits)  的時候也一樣,這些運算子是有幾個 bit 就運算幾個 bit,以下面例子是 unsigned int (32 bits)的例子,用 16 進位表示法去指定數值,可以見得一樣每一個 16 進位數值都代表了 4 bits。

-

在之前翻譯公司已經看過 & 出現在另外地方,其實習慣的話其實不容易搞混的:

優先順序

除 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

7

比較運算等於

乘法

>>位元運算子

Dec Hex Binary Dec Hex Binary
0 0 0000 8 8 1000
1 1 0001 9 9 1001
2 2 0010 10 a 1010
3 3 0011 11 b 1011
4 4 0100 12 c 1100
5 5 0101 13 d 1101
6 6 0110 14 e 1110
7 7 0111 15 f 1111

%

使用者 OpenJohn 的權限 bits: 0001 0011
意義 000x xxxx → not owner
    xxx1 00xx → 可讀group文件
    xxxx xx11 → 可讀寫公然文件

?:

加法

比力運算小於等於

&

萬國翻譯公司們說一個數字是 205 的時辰,事實上我們常常隱喻了它是個10進位數字,我們之所以把這個數字寫成 "205" 是因為:

3

為甚麼要學習2進位與16進位呢?從這個表上你可以清晰地見到16進位每個數字就恰恰好代表了 4 bits,例如 0xcd = 1100 1101:
c (16進位) = 1100 (2進位)
d (16進位) = 1101 (2進位)

2進位翻譯社 10進位, 16進位

==

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

arrow
arrow
    文章標籤
    翻譯社
    全站熱搜
    創作者介紹
    創作者 wayneb7072b0p 的頭像
    wayneb7072b0p

    wayneb7072b0p@outlook.com

    wayneb7072b0p 發表在 痞客邦 留言(0) 人氣()


    留言列表 留言列表

    發表留言