close

口譯

>=

邏輯運算OR

比力運算小於

( )

 是將數值的位元向右移動n個位元。向右移動後,超越貯存局限的數字捨去,而左側多出的位元就補上0。 

負號

11

=

除了 AND 運算之外,OR 運算的特質在於「a 與 b 只要有 1 者為 1 則 a | b 一定為 1」,若 b 為 0,則 a | b 則為 a 的原值,所以可說 OR 運算有「堆疊」或「加法」的結果,相對於 AND 運算用於剪裁影像或判斷權限,OR 運算則用於「影象重疊」或「付與權限」,類似地,NOT運算可用於「影象反白」或「獲得 清掃權限」或「獲得遮罩」影象。

+

/

if ( a != 0 && b != 0) { ...  }  // 接連兩個 && 是邏輯判定的 AND
if ( a && b ) {  ...  }          // 同上
if ( a & b ) { ...  }            // 這是 AND 位元運算,假如 a bitwise-AND b 的成效不為零...
char * ptr = & a;                // & 當一元運算子的時辰是對變數取位址

 總之 C/C++有這四種位元運算子,可用於任何資料型別,意即該型別有幾個 bits 就做幾個 bits 的運算:

前提運算子

-

到這裡你可能會問,這些位元運算有甚麼用處呢?其適用途很多,例如說,例用 AND運算子「a 與 b 均為 1 的時刻才會 1」的性質,換言之「如果 b 為 0 的話,a 不論幾何、a AND b 必定為 0」,另一方面若是 b 為 1,那麼 a AND b 就等於是 a 的原值,哄騙這個性質,就能夠以 b 做為 a 的遮罩(mask),或稱做過濾器。

電路中最根基的邏輯運算子以下所列,可說是工程人員都耳熟能詳地,假定有 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翻譯

7

<=

運算子優先挨次

位元運算XOR

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

意義 運算子 規範 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

<<

8

&

位元運算OR

所以我們只要一看到一個以16進位的數值,很直覺地就能夠知道這個數字的各 bit 為何,因此在程式中以16進位來透露表現要進行位元運算(bitwise operation)的數字長短常利便的,不然就得換算了。

乘法

請注意 2進位/10進位/16進位只是(撰寫程式碼)的時辰暗示數值的格式,不是電腦貯存數值的花樣翻譯電腦貯存數值必然是 bit by bit 的、也可以說必然是 2 進位的,然則認識分歧進位之間的換算與示意法,依然對寫程式大有匡助。

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
a = 0xcd;        // 和 a = 205 是一樣的

而 printf( ) 或其他的字串花樣化與顯示函式都有 16 進位的顯示花樣,就是 %x (小寫顯示) 或 %X (大寫顯示) 花樣字串要害字,例如:

>>位元運算子

==

 

比較運算不等於

 

要在2進位/10進位/16進位之間換算,其實最好的工具就是 Windows 內附的小算盤(calc.exe),以下圖,起首在檢視選單下,將小算盤切換到「工程型」,然後這個程式就會多出下圖密密層層的按鈕,接著選擇你要輸入數字的數值進制而且輸入數值,例如華頓翻譯公司要輸入10進位的205,所以我選擇了「十進位」然後輸入205,然後只要點選其他的數值進制,顯示的數字就會釀成其余進制,例如在圖中我點選十六進制,205 就釀成了CD,點選了二進位,205就釀成了11001101。

*

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進位)

4

printf("%x",a);  // 顯示 cd
printf("%X",a);  // 顯示 CD

位元運算類型

運算子

<<位元運算子 

邏輯運算子

優先按次

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

5

-

||

6

<

某檔案 7-11.doc 的權限遮罩: 1111 1100
意義 111x xxxx  →o wner 可讀寫刪
     xxx1 11xx → 同group可讀寫刪
     xxxx xx00 → 訪客弗成讀不行寫

所以

位元右移

&&

10

--

邏輯運算NOT

#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運算極度地經常使用,鄙人圖中的口角點陣圖(bitmap)影象,每個 bit 代表一個口角像素(pixel),所以每一個 byte 代表 8 bits,你可以看到左側的影象是個 V 字,右側的遮罩影象是個圓形。把這兩個影象每一個 byte 做 AND 的效果以下所示,等於是把 V 影象剪裁(crop)在圓形規模以內了,所以 V 的兩支銳角不見了。哄騙這個技能,可以用 AND 去裁切掉影象不要的部門。

OpenJohn 對於7 -11.doc 的權限 = AND 了局: 0001 0000
意義 000x xxxx → not owner
    xxx1 00xx → 可讀此文件
    xxxx xx00 → 不行讀寫此文件

這個技巧遍及地被各作業系統應用於利用者登入權限 與 檔案/目錄 存取權限的辦理與判讀。

9

小括號

邏輯運算AND

%

在之前翻譯公司已看過 & 泛起在另外處所,其練習慣的話其實不輕易搞混的:

遞增運算

指定運算

加法

在C 語言傍邊沒有二進位示意法與顯示花樣,所以你沒門徑在程式東打一大串 1001010101010101 以二進位來指定命值,然則有16進位的透露表現法,也就是說你可以把翻譯公司要運算的位元每4個為一組,以一個16進位的數字表示翻譯C 說話的16進位示意法就是在數值前加上 0x 前綴字,編譯器變知道這個數值是16進位不是10進位,例如:

>>

比力運算小於等於

^

1

遞減運算

如這個例子所示,我們所謂的2進位/10進位/16進位意思就是以2/10/16為底,所以205這個數字以16進位應該示意成 cd,以 2 進位應當透露表現成 11001101,把 0~15之間的數以2進位/10進位/16進位列出以下表,個中16進位(Hex)以 a~f 代表 10~15。

比力希奇的是 XOR運算,他的特點是「a和b分歧的時刻 a^b 才 1,不然 a^b 必為 0」,所以 (a^b)^b 等於 a 自己,以影象處理來說,A影象對 B 影像做 XOR,會把 B 影象堆疊在 A 之上(然則部門像素會反白),然後再對同一張 B 影象做一次 XOR 則能夠恢復 A 的原貌,所以 XOR 可以做到影像的「臨時」堆疊 (或移動中的影象),早年常常用於簡單動畫、滑鼠游標或輔助線的顯示上翻譯

|

申明

!

除法

 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 位元運算。

3

減法

下面這個例子展現了 C 語言中四種位元運算子的利用方式,請注意註解中的履行了局 c,和原始數值 a 與 b 對照,便可知道這些運算子的結果翻譯

!=

 

對照運算等於

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

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

餘數

位元運算的利用

2

位元運算AND

 將數值的位元向左移動n個位元翻譯向左移動後,超越貯存局限的數字捨去,右側位元則補上0。

AND 的運算的一個常見用處則是用在權限經管上,所謂使用者 a 對物品 b 的權限,該當是「 a 有權限使用物品、而 b 剛也有開放被使用的權限」的時刻,a 才得以使用 b 物品,假如 a 有利用物品的權限然則 b 不是公然物品,那麼 a 無法利用 b 物品,換言之,如果 b 是公開物品,然則 a 沒有利用任何物品的權限(好比權限品級只是訪客品級),a 也不克不及利用 b 物品,所以很顯然地「a 是不是有權限使用物品 b」是一個 AND 運算,舉個例子來說:

 

而 C/C++ 的位元處置運算子也是如斯,分歧的是這些運算子可以一次處置懲罰多個位元,例如 unsigned char 有 8 bits,那麼:
利用者 OpenJohn 的權限 bits: 0001 0011
意義 000x xxxx → not owner
    xxx1 00xx → 可讀group文件
    xxxx xx11 → 可讀寫公開文件

++

?:

對照運算大於等於

>

對照運算大於



以下內文出自: 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-77260932
arrow
arrow
    文章標籤
    翻譯社
    全站熱搜
    創作者介紹
    創作者 julianr7154ln 的頭像
    julianr7154ln

    julianr7154ln@outlook.com

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