Bitwise Operation位操作(邏輯運算)


  二進制(binary)在數學和數字電路中指以2為基數的記數系統,以2為基數代表系統是二進位制的。這一系統中,通常用兩個不同的符號0(代表零)和1(代表一)來表示。數字電子電路中,邏輯門的實現直接應用了二進制,因此現代的計算機和依賴計算機的設備里都用到二進制。每個數字稱為一個比特(Bit,Binary digit的縮寫)

 

  1. 數的二進制表示及按位操作

二進制數值表示,舉例:

7

6

5

4

3

2

1

0

右開始基於"0"索引號

128

64

32

16

8

4

2

1

位權值

0

0

1

0

0

0

1

0

二進制數,N = 00100010

H

G

F

E

D

C

B

A

字母標簽索引

    在此例中,整數N = 34(DEC)=100010(BIN),還可以用集合方式表示:{1,5}、{B,F},因為整數N的1、5號位為1(從右邊往左邊開始計數),字母標簽索引同理。

 

  1. 按位操作(NOT)

按位非(NOT)或求補(complement)操作,是一元運算里執行邏輯否定每一位,在給定的二進制值產生它的反碼值(one's complement)。位值是0變為1,位值是1變為0。例如:

A = 10101011

NOT A = 01010100

    許多程序設計語言(包括C程序設計語言family),取反操作符用波浪線"~"表示。值得注意的是此操作符與"邏輯非(!)"操作符不同。在C++中,邏輯非將數字整體看做一個布爾類型--將真值轉化為假,將假值轉化為真;而C語言將0轉化為1,將非零值轉化為0。"邏輯非"並不是一個位操作。

    對於無符號整數,一個數的按位補碼是該數在無符號整數范圍的中點上的"鏡像反射",舉例在二進制8位的無符號整數,NOT X = 255 - X(1111 1111dec = 255bin)。可以在圖形上顯示為向下的一條線,有效地"翻轉"0255的遞增范圍,從2550的遞減范圍。一個簡單但說明性的示例用法是反轉灰度圖像,其中每個像素都存儲為無符號整數。

    舉例四位的二進數無符號數,其值是0000~1111,十進制表示范圍:0~15;十六進制表示范圍:0~F。同理擴展到8位、16位、32位無符號整數。

0

1

2

3

4

5

6

7

8

9

A

B

C

D

E

F

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

F

E

D

C

B

A

9

8

7

6

5

4

3

2

1

0

    NOT 0010 = 1101, 1111 - 0010 = 1101, 0010(bin) = 2(oct),1102(bin)=D(oct)。以1為起步索引號,索引"3"對應"14",值"2"對應值"D",都是基於值"7"與"8"中間為分隔的對稱。

    灰度反轉(值:0~255):

                               

                               

 

  1. 按位操作 (AND)

    按位與(AND)是一種二進制運算,它采用兩個等長的二進制表示形式,並對每對對應的位執行邏輯與運算,等效於將它們相乘。因此,如果比較位置的兩個位均為1,則結果二進制表示中的位為1(1×1 = 1);否則結果為0(1×0 = 0和0×0 = 0)。

    0101 (decimal 5)

AND    0011 (decimal 3)

=     0001 (decimal 1)

    該操作可用於確定是將特定位設置為(1)還是將其清除(0)。例如,給定一個位模式0011(十進制3),要確定是否設置了第二位,我們使用按位與,並且在第二位中僅包含1的位模式:

    0011 (decimal 3)

AND    0010 (decimal 2)

=    0010 (decimal 2)

    因為結果0010不為零,所以我們知道原始模式中的第二個位已設置。這通常稱為位屏蔽。 (類比地,使用遮蓋膠帶遮蓋或遮蓋不應更改的部分或不感興趣的部分。在這種情況下,0值將遮蓋不感興趣的位。)

    按位與可用於清除寄存器的選定位(或標志),其中每個位代表一個單獨的布爾狀態。此技術是使用盡可能少的內存來存儲許多布爾值的有效方法。

例如,可以將0110(十進制6)視為四個標志的集合,其中第一個和第四個標志被清除(0),第二和第三個標志被設置為(1)。通過使用按位與,僅在第三位具有零的模式,可以清除第三標志:

    0110 (decimal 6)

AND    1011 (decimal 11)

=     0010 (decimal 2)

由於此屬性,通過檢查最低位的值來檢查二進制數的奇偶校驗變得容易。使用上面的示例:

    0110 (decimal 6)

AND    0001 (decimal 1)

=     0000 (decimal 0)

由於6 AND 1為零,因此6可被二整除,因此是偶數。

    總結:

x AND 1 = x get

x AND 0 = 0 clear(reset)

 

  1. 按位操作 (OR)

x OR 1 = 1 set

x OR 0 = X get

按位運算是一種二進制運算,采用相等長度的兩個位模式,並在每對對應位上執行邏輯"或"運算。如果兩個位均為0,則每個位置的結果為0,否則,結果為1。例如:

    0101 (decimal 5)

OR     0011 (decimal 3)

=     0111 (decimal 7)

按位可用於將寄存器的選定位設置為1。例如,可以通過對僅設置了第四位的模式執行按位"或"來設置0010的第四位(十進制2):

    0010 (decimal 2)

OR     1000 (decimal 8)

=     1010 (decimal 10)

    總結:

x OR 1 = 1 set

x OR 0 = X get

 

  1. 按位異或操作 (XOR)

按位XOR是一種二進制操作,它采用兩個長度相等的位模式,並對每對對應位執行邏輯異或運算。如果僅第一個位為1或僅第二個位為1,則每個位置的結果為1;但是如果兩個都為0或都為1,則結果為0。在此,我們對兩個位進行比較,如果兩個位為1位不同,如果相同,則返回0。例如:

    0101 (decimal 5)

XOR     0011 (decimal 3)

=     0110 (decimal 6)

按位XOR可用於反轉寄存器中的選定位(也稱為切換或翻轉)。可以通過與1進行異或來切換任何位。例如,給定位模式0010(十進制2),第二和第四位可以通過按位異或在第二和第四位置中包含1的位模式來切換:

    0010 (decimal 2)

XOR     1010 (decimal 10)

=     1000 (decimal 8)

匯編語言程序員和優化編譯器有時將XOR用作將寄存器的值設置為零的捷徑。對自己的值執行XOR運算始終會產生零,並且在許多體系結構上,此操作所需的時鍾周期和內存比加載零值並將其保存到寄存器要少。

 

總結:

x XOR 1 = NOT x invert

x XOR 0 = x get

 

應用一,所有復位:

        0110

XOR    0110

=    0000

應用二, 交換兩個數:

x ^= y;

y ^= x;

x ^= y;

new_y = y ^ (x ^ y) = x;

new_x = x ^ (x ^ y) = y;

 

  1. NAND與非操作
  2. NOR 或非操作
  3. XNOR 異或非操作

 

 

  1. 所有二進制邏輯運算符的真值表

兩個二進制變量有16個可能的真值函數,它定義了一個真值表。

這是兩個位P和Q的按位等效運算:

 

運算

說明

AND

如果所有輸入均為 TRUE,則為 TRUE

OR

如果至少有一個輸入為 TRUE,則為 TRUE

NAND

如果至少有一個輸入為 FALSE,則為 TRUE

NOR

如果所有輸入均不為 TRUE,則為 TRUE

XOR

如果有奇數個輸入為 TRUE,則為 TRUE

NXOR

如果有偶數個輸入為 TRUE,則為 TRUE

NOT

如果輸入為 FALSE,則為 TRUE

 

  1. 移位(bit shifts)

位移有時被認為是按位運算,因為它們將值視為一系列位而不是數值。在這些操作中,數字將向左或向右移動或移位。計算機處理器中的寄存器具有固定的寬度,因此某些位將在一端從寄存器中"移出",而相同數量的位從另一端"移入"。移位運算符之間的差異在於它們如何確定移入位的值。

 

  1. 位尋址

如果寄存器的寬度(通常為32或什至64)大於最小可尋址單元(原子元素)的位數(通常為8),通常稱為字節,則移位操作會在這些位上引入尋址方案。忽略寄存器兩端的邊界效應,算術和邏輯移位操作的行為相同,移位8位位置可以按以下方式將位模式傳輸1個字節位置:

小端順序:左移8位將字節地址增加1

小端順序:向右移8位將字節地址減少1

大端順序:左移8位將字節地址減1

大端順序:向右移8位將字節地址增加1

 

  1. 算術移位

在算術移位中,從任一端移出的位都將被丟棄。在左算術移位中,零右移入最右位。向右算術移位時,符號位(二進制補碼的MSB)向左移,從而保留了操作數的符號。

    示例使用一個8位寄存器:

    00010111 (decimal +23) LEFT-SHIFT

=    00101110 (decimal +46)

 

10010111 (decimal 105) RIGHT-SHIFT

= 11001011 (decimal 53)

 

在第一種情況下,最左邊的數字移到寄存器的末尾,新的0移到最右邊的位置。在第二種情況下,最右邊的1移出(可能移入進位標志),新的1復制到最左邊的位置,並保留數字的符號。有時將多個班次縮短為單個班次數位。

00010111 (decimal +23) LEFT-SHIFT-BY-TWO

= 01011100 (decimal +92)

左算術移位等於n乘以2n(前提是該值不會溢出),而右算術移位等於2的補碼值的n等於除以2n並向負無窮大舍入。如果將二進制數視為補碼,則相同的右移運算將導致被2n除並向零舍入。

 

  1. 邏輯移位

在邏輯移位中,將零移入以替換丟棄的位。因此,邏輯和算術左移是完全相同的。但是,由於邏輯右移將值0位插入最高有效位,而不是復制符號位,因此對於無符號二進制數是理想的,而算術右移對於有符號二進制補碼二進制數是理想的。

 

  1. 循環移位

移位的另一種形式是循環移位,按位旋轉或位旋轉。

  1. 環繞/旋轉

在此操作中,有時稱為"旋轉不進位",位被"旋轉",就好像寄存器的左右兩端相連。在左移期間向右移的值是向左移出的值,對於右移操作反之亦然。如果有必要保留所有現有位,這很有用,並且在數字加密中經常使用。

 

  1. 旋轉進位

進位進位是循環操作的一種變體,其中(任一端)移入的位是進位標志的舊值,而(另一端)移出的位變為的新值。進位標志。

 

一次循環進位可以通過預先設置進位標志來模擬一個位置的邏輯或算術移位。例如,如果進位標志包含0,則x RIGHT-ROTATE-THROUGH-CARRY-BY-BY是邏輯右移,如果進位標志包含符號位的副本,則x RIGHT-ROTATE-THROUGH -CARRY-BY-ONE是一種算術右移。因此,某些微控制器(例如低端PIC)只是旋轉並通過進位旋轉,而不會為算術或邏輯移位指令所困擾。

 

當對大於處理器本機字大小的數字進行移位時,循環進位轉換特別有用,因為如果將大量存儲在兩個寄存器中,則從第一個寄存器的一端移出的位必須位於寄存器的另一端。第二。使用直進式進位時,該位在第一次移位期間被"保存"在進位標志中,准備在第二次移位期間進行移位而無需任何額外的准備。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM