深入理解計算機系統(七):布爾代數以及C語言運算符

深入理解計算機系統(七):布爾代數以及C語言運算符

來自專欄 Python程序員9 人贊了文章

目錄

1、布爾代數

2、C 語言中的位級運算

3、C 語言中的 邏輯運算

4、C 語言中的 移位運算

  本篇博客我們主要講解計算機中的布爾代數以及C語言的幾個運算符

1、布爾代數

  我們知道二進位值是計算機編碼、存儲和操作信息的核心,隨著計算機的發展,圍繞數值0和1的研究已經演化出了豐富的數學知識體系。而布爾代數便是喬治.布爾(George Boole)將邏輯值 True(真)和 False(假)編碼為二進位0和1,用來研究邏輯推理的一門數學學科。

  對於布爾代數,我們需要知道以下幾種常見的運算符:

  ①、布爾運算 ~ 對應邏輯運算非。也就是取反的意思,假設 p 是0,那麼~p 就是1;反之亦然。

  ②、布爾運算 & 對應邏輯運算與。有且只有 p 和 q 都為 1 時,p & q 才等於1。

  ③、布爾運算 | 對應邏輯運算或。p 和 q 只要有一個為 1,那麼 p | q 都等於1。

  ④、布爾運算 ^ 對應邏輯運算異或。如果p、q兩個值不相同,則異或結果為1。如果p、q兩個值相同,異或結果為0。

  上面說的規則都是單個二進位進行運算。如果將其擴大到w位二進位。比如兩個二進位[aw,aw-1...a1]和[bw,bw-1...b1],它們的四種運算則是對兩者每一個相對應的位上做相應的運算。

  這裡我們給個例子:假設 w=4,a=[0110],b=[1100]。那麼四種運算 a&b、a|b、a^b、~b 結果分別如下:

2、C 語言中的位級運算

  C 語言是支持按位布爾運算的。也就是我們上面所講的四種布爾運算符其實也是 C 語言所使用的。在 C 語言中,這些運算符能運用到任何 「 整型」 的數據類型。也就是聲明為 char 或者 int 的數據類型,無論它們有沒有 short、long或者 unsigned。下面給出對 char 數據類型表達式求值的例子:

3、C 語言中的 邏輯運算

  C 語言中的邏輯運算符 ||、&&、! ,分別對於命題邏輯中的或、與、非。注意 邏輯運算 和 位級運算 它們的功能是有很大的區別的。

  ①、邏輯運算認為所有非 0 的參數都表示 true,只有參數 0 表示 false。它們返回 0 或 1 ,分別表示結果 false 和 true。

  ②、邏輯運算 && 和 || 有短路功能。比如對於表達式 p&&q,p||q,如果p的值可以確定整個表達式的結果,那麼將不會計算q的值(q可能是一個表達式)。但是對於p & q則不同,無論p表達式的值為何,都要計算q表達式的值。

4、C 語言中的 移位運算

  移位運算分為左移右移。

  左移:運算符是 << ,丟棄最高位,低位補0

    對於一個二進位數[aw,aw-1,...a1]來說,如果將它進行左移運算,則x << k = [aw-k,aw-k-1,...a1,0,...0]。此時相當於最高的那k位都被丟棄了,在最右端補了k個0。

  右移:運算符是 >>。右移一般機器支持兩種形式,邏輯右移和算術右移。

    邏輯右移在左端補k 個0。C語言中對於無符號數據必須邏輯右移。

    算術右移是在左端補 k 個最高有效位的值。

  這在Java當中是有明確定義的。表達式 x>>k會將 x 算術右移 k 個位置。表達式 x>>>k 會將 x 邏輯右移 k 個位置。


推薦閱讀:

Python3 函數04
別上編程培訓班了,真的,
ALSA編程指南

TAG:編程語言 | 計算機 | 編程 |