深入理解電腦系統(2.2)---布爾代數以及C語言上的位元運算

來源:互聯網
上載者:User

標籤:

本文轉載地址:http://www.cnblogs.com/zuoxiaolong/p/computer6.html

 

布爾代數上的位元運算

           布爾代數是一個數學知識體系,它在0和1的二進位值上演化而來的。

           我們不需要去徹底的瞭解這個知識體系,但是裡面定義了幾種二進位的運算,卻是我們在平時的編程過程當中也會遇到的。這四種運算分別是或、與、非和異或。展示了在布爾代數的知識體系中,對這四種運算的定義。

           從左至右依次是非、與、或以及異或。這個圖闡述的是針對一位二進位的運算結果,我們可以將其擴大到N位二進位。比如兩個二進位[aw,aw-1...a1]和[bw,bw-1...b1],它們的四種運算則是對兩者每一個相對應的位上做相應的運算。

           也就是說,倘若假設結果是[cw,cw-1...c1]的話,那麼對於任意ci都滿足 ci = ai (|,&,^) bi,如果是對[aw,aw-1...a1]進行非運算的話,那麼ci = ~ai。

 

C語言上的位元運算

           在C語言中,也支援位元運算,而它的計算方式就是布爾代數中的位元運算。位元運算我們最常使用的是掩碼的方式。比如我們知道一個整數x,如果我們想取得這個整數的最後一個位元組的整數值的話,就可以採用位元運算。就像下面這樣。

#include <stdio.h>int main(){     unsigned int i = 0x12345678;     unsigned int j = 0xFF;     unsigned int k = i & j;     printf("%X\n",k);}

           最終我們希望得到的結果是78,也就是整數i的最後一個位元組的值,我們使用掩碼0xFF以及與運算過濾掉整數i的高位的三個位元組。以下是結果。

    

C語言的邏輯運算

           C語言中的邏輯運算有||、&&和!,這比較容易與剛才的|,&和~搞混。邏輯運算比較特別,在這種運算的結果中認為所有非0的數值都是true,而為0的則為false。LZ在此寫了一個小程式,我們來簡單的看下二者的區別。

#include <stdio.h>int main(){      unsigned int x = 0x12345678;      unsigned int i = !x;      unsigned int j = ~x;      unsigned int m = !!x;      unsigned int n = ~~x;      printf("%u %u\n",i,j);      printf("%u %u\n",m,n);}

          從這個程式的結果可以很明顯的看出!和~運算的區別,我們來直接看結果吧。

          結果很明顯,左邊是!x以及!!x的結果,只有0和1,而右邊則是~x和~~x的結果。這裡可以很明顯的看出邏輯非與位的非運算的區別。前者只有0和1,而後者則是對每一位二進位值取反。

          除了結果上的區別之外,它們二者還有一個區別,就是邏輯運算倘若可以根據第一個運算式確定結果的話,那麼將不會計算第二個運算式。舉個簡單的例子,假設有兩個運算式a和b,對於a && b,倘若a為假,則不會計算b運算式的值。但是對於a & b則不同,無論a運算式的值為何,都要計算b運算式的值。

 

C語言的移位元運算

          移位元運算分為兩種,左移和右移。對於一個位元[aw,aw-1,...a1]來說,如果將它進行左移運算,則x << k = [aw-k,aw-k-1,...a1,0,...0]。此時相當於最高的那k位都被丟棄了,在最右端補了k個0。而對於x >> k來說,也就是右移運算,與左移是類似的,只不過為了照顧有符號數,有時候需要在左端補最高位而不是0。而對於補0的情況,則稱為邏輯右移,補最高位的則稱為算術右移

          也就是說,對於邏輯右移來說,x >> k = [0,...0,aw,aw-1,...ak+1],而對於算術右移來說,x >> k = [aw,...aw,aw,aw-1,...ak+1]。

 

本章小結

          本章主要只是簡單的介紹了下C語言中的位元運算,下一章將會介紹一下整數的表示方式。

深入理解電腦系統(2.2)---布爾代數以及C語言上的位元運算

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.