數據的表示和運算

2021-01-08 編程師兄

前言

◆ ◆ ◆ ◆

這期本來是想寫hashMap的,但是裡面哈希和擴容之類的,很多都是位運算,不太熟悉的同學看著會很難受,所以先補充一些計算機組成的知識。

進位轉換

◆ ◆ ◆ ◆

計算機中,二進位是最廣泛的一種數制,以高低電平來表示二進位。當數碼很大時,書寫不方便,從而引進八進位和十六進位,但是其實計算機內部都是二進位。

我們熟悉的十進位如何在計算機中表示呢,比如把十進位數19.6875轉化為二進位。

首先整數部分和小數部分需要分開來算。

整數部分:除2取餘,自下而上

19/2=9 餘1

9/2=4 餘1

4/2=2 餘0

2/2=1 餘0

1/2=0 餘1

(商為0為結束標誌)

所以餘數自下而上寫:10011

小數部分:乘2取整,自上而下

0.6875*2=1.375 取1 餘0.375

0.375*2=0.75 取0 餘0.75

0.75*2=1.5 取1 餘0.5

0.5*2=1 取1 餘0

(取1餘0為結束標誌)

所以自上而下表示:1011

綜上,19.6875的二進位表示為:10011.1011

真值和計算機數

◆ ◆ ◆ ◆

日常表示為+6、-8、-0.756這樣的數成為真值。但是計算機並不知道「+」,「-」。由於0、1正好為兩種狀態,於是就規定0表示正號,1表示負號,這樣被數位化的數就稱為計算機數

BCD碼

◆ ◆ ◆ ◆

二進位編碼的十進位數(Binary Coded Decimal,BCD)是以二進位數來編碼表示二進位0-9,分為兩類:有權BCD碼,如8421碼、2421碼、5421碼等;無權BCD碼,如餘3碼、格雷碼等

(1)8421碼:用四位二進位數表示一位十進位數,權值從高到低為8,4,2,1。如101001表示29

(2)餘3碼:8421碼的基礎上加上十進位3

定點數的表示

◆ ◆ ◆ ◆

無符號數表示:整個機器字長全部二進位均為數值,沒有符號為,相當於數的絕對值,如機器字長為8位,表示範圍為0-2^8-1,即0-255有符號數表示:0表示正號,1表示負號,一般為:原碼、補碼、反碼(1)3種機器數的最高位都為符號位(2)當真值為正數時,原碼、補碼、反碼的表示均相同,即符號位為0,數值部分和真值相同(3)當真值為負數時,符號位為1,數值部分,補碼是原碼的「每位求反加1」,反碼為原碼的「每位求反」。注意:僅數值部分,不包括符號如:+1110,原,補,反均為01110-1101,原碼:11101,補碼:10011,反碼:100100的原碼和反碼都有兩種,補碼只有一種表示範圍如下:

原碼:-(2^(n-1) -1)~ (2^(n-1) -1)

補碼:-2^(n-1) ~ (2^(n-1) -1)

反碼:-(2^(n-1) -1)~ (2^(n-1) -1)

移碼

◆ ◆ ◆ ◆

介紹一下補碼的缺點,舉個例子

從代碼形式上看,符號位也是一位二進位,將這些二進位代碼進行比較,會得出101011>010101,100001>011111,其實恰好相反,這就是補碼的缺點,但是可以通過移碼來彌補。

將每一個真值加上2^n,如例子中n為5,得到

這樣就能得到110101>001011,111111>000001

加上真值的過程其實就是移碼

是不是比較懵逼……

其實,移碼就是補碼的符號位取反

補碼的好處

◆ ◆ ◆ ◆

假設機器字長為4位,一位為符號,則補碼的範圍為-8~7,列出看一下

0000 0 1000 -8

0001 1 1001 -7

0010 2 1010 -6

0011 3 1011 -5

0100 4 1101 -4

0101 5 1101 -3

0110 6 1110 -2

0111 7 1111 -1

優點1:補碼的設計可以滿足x+(-x)=0,因為高位進位捨去;知道x的補碼,求-x的補碼,為:x的補碼連同符號位在內每位取反再加1。

優點2:0的補碼只有一種

優點3:補碼的符號位可以參與運算,不需要單獨設置電路

優點4:採用補碼運算後,補碼可以將正數加負數轉化為正數加正數,又可以將減法轉換為加法運算,這樣就只設加法器就可以了

優點5:補碼可以解決補碼數的擴充問題。因為在補碼表示中,全「1」代表-1,所以對負數補碼進行擴充,可以直接補符號位,如1001擴充為8位,可以寫為11111001;0111擴充為8位,可以寫為:00000111

所以大部分計算機系統都採用補碼來表示機器數

定點數的移位運算

◆ ◆ ◆ ◆

當某個二進位數相對於小數點做n位左移或者右移時,相當於該數乘以或者除以2的n次方。由於計算機中的機器字長都是固定的,當機器數左移或者右移時,都會使其n位低位或者n位高位出現空缺,就需要補0或者補1。需要考慮邏輯位移和算術位移。

(1)邏輯移位:邏輯左移時,高位移丟,低位補0;邏輯右移時,低位移丟,高位補0。如寄存器的內容為:10001010,邏輯左移為00010100,邏輯右移為01000101.

(2)算術移位:

<1>當機器數為正時,

1)原碼:左移右移都補0

2)補碼:左移右移都補0

3)反碼:左移右移都補0

<2>當機器數為負時,

1)原碼:左移右移都補0

2)補碼:左移補0右移補1

3)反碼:左移右移都補1

補碼定點數的加/減法運算

◆ ◆ ◆ ◆

(1)補碼加法:符號位參加運算,兩數和的補碼等於兩數的補碼之和,公式為

[x+y]補=[x]補+[y]補

(2)補碼減法:運算器只包含加法器,於是需要用到[y]補和[-y]補,公式為

[x-y]補=[x]補+[-y]補

加減法的溢出判斷

◆ ◆ ◆ ◆

(1)一位符號位判斷溢出:一個正數和一個負數相加是不會溢出的。參加運算的兩個數符號相同,其結果的符號可能與操作數不同,即為溢出,硬體實現判斷為:

最高有效位的進位異或符號位的進位=1

則為溢出

比如:兩個正數相加,符號位都是0,數值的最高位產生進位1,這個進位會進到符號位,符號位由0變成1且不會向上產生進位。所以最高有效位的進位=1,符號位進位=0,異或等於1,產生溢出。如果兩個操作數都是負數,如果數值的最高位向上沒有進位=0,因為符號位都是1,符號位向上進位=1,產生溢出。

(2)兩位符號位溢出判斷:雙符號位相同,則未溢出,雙符號位不同,則為溢出,最高符號位代表真正的符號。

補碼乘法一位乘

◆ ◆ ◆ ◆

被乘數與部分積一般取雙符號位,並且符號位參與運算。(原因:一旦產生溢出,單符號位會出錯,而雙符號位的最高位是正確的符號位)乘數取單符號位以決定最後一步是否需要校正,即是否加[-x]補乘數末尾增設附件位Y(n+1),初始值為0根據Yn和Y(n+1)判斷位,進行運算,步驟同上根據上述算法進行n+1步,但是第n+1步不再移位,僅根據Y0,Y1比較結果決定是否要加[x]補按補碼移位規則,即部分積為正時,右移過程中有效位最高位補0;部分積為負時,右移過程中有效位最高位補1;雙符號的移位中,次高符號位參與移位,最高位不參與針對第四步,給出下列規則表

是不是很懵,用一個例子來看一下:

已知[x]補=1.0101,[y]補=1.0011,求[xy]補

解:先求[-x]補=0.1011,詳細過程如下

看懂表格可能就了解得差不多了。如果看不懂,可以加小明同學聊聊。

算數邏輯單元ALU

◆ ◆ ◆ ◆

數字電路一般可分為組合邏輯電路和時序邏輯電路。

組合邏輯電路:在邏輯功能上的特點是任意時刻的輸出僅僅取決於該時刻的輸入,與電路原來的狀態無關。也就是說,組合邏輯電路沒有記憶功能,運算後的結果要立刻送入寄存器保存時序邏輯電路:在邏輯功能上的特點是任意時刻的輸出不僅取決於當時的輸入信號,還取決於電路原來的狀態。也就是說,時序邏輯電路具有記憶元件,即觸發器(能夠存儲一位信號的基本單元電路),可以記錄前一時刻的輸出狀態。ALU是一種組合邏輯電路,因此實際使用ALU時,其輸入埠A和B必須與鎖存器相連,而且運算過程中鎖存器(多位觸發器)的內容是不變的,其輸出必須送至寄存器保存。

ALU主要功能:ALU的功能不僅僅是執行算術(加、減、乘、除)和邏輯運算(與,或,非,異或)的部件,還具有先行進位邏輯。在並行加法器的並行進位鏈就是使用ALU。

下圖就是ALU的電路框架

其中A,B為輸入變量,K為控制信號,K的不同取值可以決定該電路進行哪一種算數運算或哪一種邏輯運算,F為輸出

串行加法器

◆ ◆ ◆ ◆

首先介紹一下全加器。全機器是一個加法單元,而一個加法單元是一個三端輸入、兩端輸入的加法網絡,如圖所示

其中Ai代表被加數,Bi代表加數,Ci-1代表低位穿來的進位,Ci代表本位向高位的進位,和為Si

只設一個全加器的加法器稱為串行加法器。兩個操作數分別放到兩個移位寄存器中,並且由移位寄存器從低位到高位串行地提供操作數進行相加。如果操作數長16位,就需要分成16步進行,每步產生一為和,串行地送入結果寄存器,而產生的進位信號只需要一位觸發器,每完成一步,用新的進位覆蓋舊的進位。串行加法器的結構如下圖

所得的結果保存在操作數A的寄存器中,但是每次都是一位參與運算,速度太慢。如果操作數長16位,就需要分成16步進行,這是不可接受的。於是就有並行加法器

並行加法器

◆ ◆ ◆ ◆

由n+1個全加器構成的並行加法器,這樣兩個n+1位的數可以利用這個加法器並行計算。

對於每一個全加器,有三個輸入,其中兩個輸入對應了參與運算的兩個數的響應位,另一個輸入是低位的進位。有兩個輸出,一個輸出是對應的加法和的結果對應位,另一個輸出是本地產生的向高位的進位

每個全加器的結果Si是如何產生的呢?

Si指出了運算結果某一位到底是1還是0.如果輸入的三位都是1或者其中一位是1,另外兩個是0,對應的Si就為1,表達式為

這個表達式中,A和B都是參與運算的數據,保存在寄存器中,但是Ci-1是由低位產生的進位,只有這個進位產生後,才能計算出Si。所以影響速率就是Ci-1的產生。

那進位C是如何產生的呢?

如果三個輸入都是1,或者兩個輸入是1,一個輸入是0,就會產生進位,表示為

我們把AiBi叫做本地進位,也就是本地參與運算的兩個數據響應的位就會產生的進位。另外Ai+Bi表示傳送條件,用ti表示。如果這個或的值為1,那麼Ci-1的結果就會被傳送到Ci。所以我們就知道進位也可以由輸入的Ai和Bi知道,所以就能快速產生進位了。

我們記AiBi為di,則進位表示如下

串行進位鏈

◆ ◆ ◆ ◆

進位鏈:傳送進位的電路。也就是說在加法器中,我們可以把進位產生的電路獨立出來,產生進位以後相應的進位再和AiBi一起參與運算生成Si。

我們以4位全加器為例,則每一位的進位表達式為

為了使用與非門實現進位鏈,對上面表達式進行變換,則

根據表達式,得出通過與非門產生的串行進位鏈:每個進位的產生需要採用兩個與非門。如C0為例,根據變換的結果,使用t0和C-1的與操作,再做非操作輸出,之後用d0的非和之前得到的結果再做與操作,非操作,就可以得到C0。這樣我們就可以依次得到如下串行進位鏈。

並行進位鏈

◆ ◆ ◆ ◆

串行加法還是太慢了怎麼辦呢,這樣就可以考慮是不是可以並行輸出,讓n位的加法器的進位同時產生。

首先對串行進位鏈中得到的表達式再進行變換得到如下

回顧一下,ti=AiBi,di=Ai+Bi

這樣我們就可以由每一位參與運算的的位直接得出了所有進位了!這種稱為並行進位或者跳躍進位。

單重分組跳躍進位鏈

◆ ◆ ◆ ◆

上圖的跳躍進位的電路很複雜,而且才4位數。如果是32位或者64位,則會非常龐大而且複雜。為此又產生了兩種折中的跳躍進位鏈。

n位全加器分成若干個小組,每個小組中的進位同時產生,小組之間串行進位。

以16位為例子

上圖中,組和組之間採用串行進位,也就是說當第四組中的C3產生以後,把C3作為輸入輸入到第三組中,這個C3和第三組中的di,ti配合,生成第三組中的所有Ci,同樣第二組,第一組同理。

雙重分組跳躍進位鏈

◆ ◆ ◆ ◆

n 位全加器分若干大組,大組中又包含若干小組。每個大組中小組的最高位進位同時產生。大組與大組之間採用串行進位。

上圖中,將32為分成2個大組,每個大組中分為四個小組,每個小組中四位。C3,C7,C11,C15對應了,8,7,6,5,四個小組的最高位的進位,這四個進位同時產生。同樣,對第一大組來說C19,C23,C27,C31對應了4,3,2,1四個小組中的最高位進位,這四位進位也是同時產生。另外大組和大組之間採用串行進位的方式,也就是C15產生之後,作為輸入,輸入到第一大組中,用以產生第一大組中每個小組的最高位的進位和其他的進位。

看完這些,考研都夠用了~

◆ ◆ ◆ ◆

- end -

祝各位人人都能漲20K!

每個人都是技術大牛!

- TEN END -

相關焦點

  • 數據類型、運算符和表達式
    數據是C語言基本字符組合成的信息表達,它既是程序加工和處理的對象,也是程序加工和處理的結果。同樣的字符組合可能會表示不同的涵義,因此需要對C語言程序裡面的每一組數據進行定義,好方便最終機器對該數據的識別和處理。
  • 數據分析實踐入門(四):數據運算
    任意一列乘/除一個常數值,這一列中的所有值都乘/除這一常數值二、比較運算比較運算和Python基礎知識中講到的比較運算一致,也是常規的大於、等於、小於之類的,只不過這裡的比較是在列與列之間進行的。常用的比較運算符見2.9.2節。在Excel中列與列之間的比較運算和Python中的方法一致,例子如下圖所示。
  • Python數據分析中Pandas數據運算實踐
    算數運算寫到這裡小編發現個問題,用這份數據演示算數運算屬實有點不大合適,滿臉尷尬。小編這麼懶的人都寫到這了,肯定是不會換數據集了,各位看官就這麼湊合著看吧,先聲明一下,以下演示均無實際意義。比較這裡我們選用存活數和親屬數量做比較,幾個簡單的示例:同理,這裡除了可以使用 > 還可以使用 >=、 != 、 < 和 <= 等運算符。統計分析前面我們使用 describe() 這個方法自動的獲取過當前數據集的一些統計數據,那麼我們如何手動的來獲取它呢?
  • 可視化介紹:NumPy和機器學習數據表示
    在最流行的三大數據處理棧R、Matlab和Python中,NumPy是最重要的組件之一,有很多Python系的數據處理系統都依賴NumPy作為其基礎架構的基礎部分,比如tensorflow、pandas、SciPy和scikit-learn等。NumPy極大地簡化了向量和矩陣的操作和處理。
  • 數學運算和它們的逆運算
    一級運算包括加法和減法。加法a+b=c,由此推出逆運算,減法c-a=b和減c-b=a。也可以把減法看做加法,即c+(-a)=b和c+(-b)=a。二級運算包括乘方和除法。乘方a×b=c,由此推出逆運算,除法c÷a=b和除法c÷b=a。也可以把除法看做乘法,即c×(1/a)=b和c×(1/b)=a。
  • 教學研討|3.1.5 空間向量運算的坐標表示
    (二)過程與方法:1、通過類比平面向量運算的坐標表示得到空間向量運算的坐標表示,掌握其運算規律,並滲透類比的思想;2、通過例題和練習讓學生掌握用坐標法解決立體幾何問題的一般步驟,體會向量法在研究空間圖形中的作用,培養其空間想像能力和幾何直觀能力.
  • 基於NOR Flash的數據運算方法專利揭秘
    目前市面存在的基於CPU、GPU等的計算系統都是基於馮諾依曼結構,其運算與存儲部件是分離的,進行計算時,計算單元需要將數據從存儲單元中提取出來,處理完成後再寫回存儲單元,這種結構導致了密集數據計算時需要在存儲部件與計算部件傳輸大量數據,這就造成計算速度受到數據傳輸帶寬限制,同時引起功耗增加,限制了計算系統的性能提升。
  • 計算機中所有數據是二進位保存,這些複雜電路是如何做運算的呢?
    邏輯是指對某個事物的推理,「真」和「假」是兩個對立的邏輯狀態,邏輯運算是指用數學符號來表示邏輯狀態,以便於用數學方法研究邏輯問題。我們通常將電路通電狀態表示為「真」,用數字「1」表示,不通電錶示為「假」,用數字「0」表示。「或」、「與」、「非」是三種基本邏輯運算,計算機邏輯運算也包含「異或」、「位」。
  • Excel高手進階:公式與函數混搭,輕鬆實現複雜的數據運算
    在 Excel 中進行數據計算和統計時,使用一些簡單的公式和函數常常無法得到需要的結果,還需要讓公式和函數進一步參與到複雜的運算中。今天的文章,小編將會為大家講解公式和函數的混合使用,幫你輕鬆完成複雜運算~讓公式與函數實現混合運算在 Excel 中進行較複雜的數據計算時,常常需要同時應用公式和函數,此時則應在公式中直接輸入函數及其參數,如果對函數不是很熟悉也可先在單元格中插入公式中要使用的函數,然後在該函數的基礎上添加自定義公式中需要的一些運算符、單元格引用或具體的數值
  • 資料庫的關係運算和完整性約束
    對關係資料庫進行查詢統計時,需要查詢到用戶感興趣的數據,這就需要對關係及關係間進行一定的運算。本篇主要講述關係運算和關係的完整性約束,理解關係操作的含義,了解傳統的集合運算,掌握關係代數中基本關係運算。
  • 對數和對數運算
    對數的運算法則都還沒搞清楚,三、四節課下來,老師已經講完了,早己經進入對數函數了。只剩下你和對數在秋風中乾耗:對數,我認識你嗎?你怎麼這麼多運算法則?換底公式你為什麼長得這麼奇怪?有沒有人能告訴我對數恆等式是正確的,它不會是老師硬塞給我的吧。二. 關於對數,我很希望你高一就搞明白。不至於高三了還要死啃這個討厭鬼-對數。
  • Excel數值運算常出錯?與公式無關,往往是你的單元格數據出錯了
    在大多數人眼裡,Excel函數只能方便我們對同類型數據進行快速運算,如果遇到數據格式不統一的情況,就要逐步排查修改不同格式的數據,讓其數據類型統一後再計算。而由於我們現實生活中,每個人的制表習慣不一樣,當我們把多個人的表格提取到一張表時,往往會出現同類別下的數據登記類型不同,這對於需要做出總結報表的人而言,需要一一修改格式是非常繁瑣的一件事。
  • 行列式之逆序數和一般運算法則
    本文將對行列式的由來和一般運算法則進行詳細講解,這裡面包括很多同學都不甚理解的逆序數。小編在此多說一句,存在即合理,任何一個概念的提出都是基於現實或理論上的需要,只有把握了這種內在需求,才能在整個線代的前後知識模塊之間建立清晰地邏輯框架。
  • 十進位數的編碼與運算
    蠕變碼(Creeping Code)也用5位基2碼,是由一個"1"逐次移位擴展和收縮而形成的,符合格雷碼的編碼規則。④ 數字串在計算機內的表示與存儲  人們習慣使用10進位數,而在計算機內,採用二進位表示和處理數據更方便。因此,在計算機輸入和輸出數據時,要進行十→二和二→十的進位轉換處理,這是多數應用環境中的實際情況。
  • excel數學運算函數:表格中積商和餘數的處理方法
    今天我們就來學習一下excel中關於「積」和「商」的數學函數,趕緊來看看吧!對於「積」和「商」我們都不陌生,好多地方都會用到它,在EXCEL中除了可以用「*」、「/」等運算符來得到數據的「積」和「商」外,函數同樣也可以。今天我們就來了解一下EXCEL是怎麼使用函數來得到數據的「積」和「商」?我們又該如何在工作中更好地運用它們!
  • 運算放大器類型分析和經典電路分享
    高速型運算放大器:  主要特點是具有高的轉換速率和寬的頻率響應。  低功耗型運算放大器:  由於電子電路集成化的最大優點是能使複雜電路小型輕便,所以隨著可攜式儀器應用範圍的擴大,必須使用低電源電壓供電、低功率消耗的運算放大器相適用。
  • 如何使用Numpy進行運算?
    Numpy數組運算Numpy數組運算(如根據布爾型數組進行過濾、標量乘法、應用數學函數等)都會保留索引和值之間的連結:如:@ In [7]: obj2[obj2>0]@ In [8]: obj2*2@ In [10]: np.exp(obj2)2.可使用部分字典參數的函數Series可被看成是索引值到數據值的一個映射
  • Java二進位和位運算,這一萬字準能餵飽你
    二進位在了解什麼是位運算之前,十分有必要先科普下二進位的概念。二進位是計算技術中廣泛採用的一種數制。二進位數據是用0和1兩個數碼來表示的數。它的基數為2,進位規則是逢二進一,借位規則是借一當二。因為它只使用0、1兩個數字符號,非常簡單方便,易於用電子方式實現。
  • EXCEL知識:數組運算是什麼?
    下面我主要介紹一些我自己理解的數組運算。什麼是數組在Excel中,數組可以理解為多個單元格的集合。單行數據,單列數據(一維數組),多行多列數據(二維數組),都可以是一個數組。如下圖所示:上圖中數組1和數組2為一維數組,數組4和數組5為二維數組。
  • 向量的運算
    在2020年最後一天,讓我們一起學習一下向量的運算吧!內容很簡單,讓我們準備好小本本。我們可以對向量進行加(+)、減(-)、乘(*)、除(/)和乘方(^)運算。進行運算時是對向量的每一個元素進行運算。加法運算x<-c(1,4,2,5,6)y<-c(2,6,7,3,5)z<-x+y+1zx<-c(1,4,2,5,6)y<-c(2,6,7,3,5)z<-x-y-3zx<-c(1,4,2,5,6)y<