









XYXZNB(*^ワ^*)*\(^o^)/*
我們已經知道了定點數在計算機內部如何表示分為無符號數和有符號數啊,其中有負號數可以用元碼補碼,反碼和移碼這樣的4種方式來表示,那么從這個小節開始,我們要學習定點數的相關的運算,應該怎么實作分為移位運算,還有加法減法運算,乘法運算,除法運算,其中一位運算和加減運算的考察頻率是更高的,那這一小節中我們先來學習定點數的一倍運算,怎么實作那移位運算,又可以進一步的劃分為算術移位,邏輯移位,還有回圈移位,我們會按從上至下的順序依次講解,好,那首先來認識一下什么叫做算術移位,我們從大家熟悉的十進制數出發啊,假設這兒有這樣的一個10進制數985.211,那么我們從小經常做的一個事情是讓小數點后移一位或者后移兩位相當于整個數值也就是幾十到二十八小時,次方也就是奇數的一次方,小數點后移兩位,相當于乘以10的二次方,那小數點往前移也是類似的一個效果,只不過往前移的話,那相當于是除以10的一次方和除以10的二次方,這是大家在小學的時候就學會的東西,那如果結合我們之前對R進制數它的實際數值的一個定義來看的話,其實我們移動了小數點之后,相當于改變了每一個數碼位的位權,因為每一個位的位權為多少,其實是以小數點的位置作為參考的,所以所謂的算術移位,算術移位的意思就是我們通過改變各個數碼位和小數點的這種相對位置,從而改變各個數碼位的位權,那我們可以用這種算術移位的方式來等價的實作乘法和除法,這是大家熟悉的實際值,那對于我們之前的小節中學習到二進制數其實也是一樣的,對于定點數來說我們沒辦法改變小數點的位置,但是山不轉,對于定點數來說我們沒辦法改變小數點的位置,但是山不轉可以讓水轉,所以我們如果能夠移動這個數值部分,只要能改變每一個數值位和小數點的相對位置關系,那我們同樣可以實作算術移位的運算,比如這我們已經有了-20這個數的原碼,表示好來看一下進行了算術又移又移了移位之后,啊,得到的這個值應該是2的一次方,再加上23次方也就是等于10,那么在考慮上這個符號位就應該是-10這樣的一個值,所以和我們之前實際是推出的結論是類似的,當我們對二進制的這種定點數右移移位之后,相當于我們實作了除以基數的一次方,這樣的一個操作,那結合這個圖并不難理解,本來以前這兩個一它們的權重分別是2的4次方和2的二次方,那右移一位之后,它們的權重都分別除以了2,一個變成二的三次方,一個變成2的一次方,整體都是這樣縮小了一半, R的三次方,一個變成R的一次方,整體都是這樣縮小了一半,所以這就是算術右移的一個效果,相當于除以2,好我們再用一位,那么剛才這個最低位就會移動到啊,小數點的后面這個位置,由于我們的機器字長有限,所以移出去的這一位我們就只能舍棄不用,那同樣的新的這個高位我們會用0來補充,那這次右移的結果,同樣也是相當于再除以一個2,好繼續在這個基礎上我們再右移一位,那這個時候我們會把末位的一給移出啊,這8個位元的范圍同樣高位補0,不過這個時候得到的值啊,它應該是-2這樣的一個值,已經不是-5÷2的精確表示了,因為-5÷2應該是負的2.5,這樣才是精確的除以2的值,那這是因為我們移出去的這一位,它的值不是0而是1其實相當于我們舍棄了一個進度因此得到這樣的結論當我們進行算術一的時候首先高位,算術右移的時候,首先高位會用0來補充,然后低位直接舍棄,如果我們舍棄的這一位是0的話,那么就相當于嚴謹的除以2的一個結果,而如果我們舍棄的這一位不等于0,那在這種情況下我們會丟失一定的精度好,這是算術又一接下來來看算術左移,那左移的方式也是一樣的,我們只讓這個數值部分進行移動符號位是保持不變的,那進行左移之后,原本數值位的最高位會被我們舍棄,而最低位出現的這些空位,我們會用零來代替,那進行這樣的一次右移之后得到的結果應該是負的40相當于在原有的基礎下乘以2,那如果再做一位也是類似的效果,我們丟棄最高倍的林湘,當于在原有的基礎上再乘以一個2,而我們在做第1位,由于這次我們丟掉的最高位,他是1,所以最終我們得到的結果是等于負的32就不是這樣,這么簡單了,這點其實也很好理解,因為我們原本左移兩位的時候,這個數值就已經到了負的80這樣的一個值,那負的80,如果讓它再乘以2,應該是負的160這么多,而這個地方我們原碼的尾數只有7位,7個位元位只能表示0~127這樣的一個絕對值的范圍,所以160肯定是已經超出7個位元貝能夠表示的范圍,那這種情況下我們丟棄最高位的一拳值最高的那個一被我們丟棄了,當然就會出現這種嚴重的誤差,他們這是對原碼的算術作業需要注意的地方,好的,那目前為止我們探討的啊,算數左翼和算術,右一是基于用原碼表示的定點整數來探討的,那如果不是定點整數而是定點小數,其實也是一樣的道理,一樣的效果當我們進行算術左移的時候,同樣相當于×2的一個效果算術右移,相當于除以2的一個效果所有的這些他們的味全在做,1他們的位權在左移和右移的時候分別會乘以2和除以2好,所以定點小數,我們就不再單獨的探討好,那接下來我們再反基于反馬的算術移位這兒我們已經給出了正20和-20的一個原碼表示那由于正數的反碼表示和原碼表示是一模一樣的,所以對于正數的算術移位,不管是左翼還是右翼處理的方法都適合原始碼一樣啊,這是反碼表示的正數啊,需要采取的一個策略和原始碼是一樣的好再來看復數也就是符號V為1的數這種數的反馬尾數部分和原始碼是完全相反的,一變成00會變成一砝碼的,一相當于原始碼的零砝碼的,0相當于原始碼的1,所以對負數的算術移位,我們進行補位的時候需要注意,我們補的都是伊娜,這是對于反碼的算術移位,正數和負數我們需要補充的這個味是不一樣的,好接下來我們再來看補碼的算術移位,補充的這個味是不一樣的,好,接下來我們再來看無碼的算術移位,那由于正數的補碼表示和原始碼也是一樣的,所以對于正數補碼的移位運算,我們同樣和原始碼保持一樣的策略就可以都是需要用云來補充移動之后出現了空位,而負數補滿的一位會相對來說復雜一些,補碼是從反馬的基礎上末位嘉羿得到的,那反馬的末位加一會導致砝碼當中更靠后的這些一都會變成0,并且都會發生進位,直到進到第1個0這個地方的位置,所以砝碼轉補碼有這樣的一個規律,就是從砝碼的最右邊這一位開始,從右往左依次的取法,把1都變成0,直到碰到第1個0為止,把砝碼的第1個0變成1之后,再往前的這些部分就不用再改變了,所以負數的補碼呈現出了這樣的一個規律,在這個補碼最右邊的一個1,還有這個一這些部分這些,一個一還有這個一你用的這些部分,這些部分是和原始碼保持一致的,而最右邊的這個一左邊的這些部分,這些部分又是和砝碼保持一致的,所以當我們對補碼的這些尾數進行算術右移的時候往右移會導致高位出現一個空位,那我們補這個空位的方法應該是和反碼的啊,補空位規則是保持一致的,也就是補一,而當我們對補碼進行算術左移的時候,最低位會出現一個需要補的空位,那由于補碼的后半部分和原始碼是相同的,所以我們在補這個空位的時候應該補0,因此我們得到結論,對于負數補碼的算術移位,當右移的時候我們應該補一,然后低位審計剛進行算術左移的時候應該低位補0,然后高位舍棄我們就保證the相當于除以2的一個效果,算術左移相當于×2的一個效果好的,那我們在對算術移位進行一個小小的總結,對于正數來說由于原碼補碼反碼啊,他們的正數表示都是一樣的,所以我們需要補位的時候都是用銀趣步,而對于負數來說補碼的負數左1的時候需要填,0右1的時候是要添一而砝碼的復數,不管左一還是右1,我們都是要添一,不管左移還是右移,我們都是要添1那只要遵從這兒給出的規定,無論我們使用的是什么呢,只要我們進行的是算術左移就相當于×2,主要是右移就相當于除以2,只不過由于我們機器自成呃位數有限,所以有的時候我們沒辦法用算術一位精確的來等效乘除法,這一點我們再講原始碼的左移和右移的時候特別的強調過好,接下來用一個簡單的例子讓大家體會一下算術移位的一個呃具體的應用,接下來我們再來看第2種,一位叫做邏輯移位,那邏輯移位的規則很簡單啊,當我們右移的時候高位50,然后低位移出的這一位直接舍棄就可以,左1的時候我們在低位補靈,然后移出的這一位,我們直接手機就可以那邏輯移位的,這種規則我們可以把它看作是對無符號數的算術移位,好,這個規則很簡單,那我們來看一下邏輯移位有什么作用,比如說啊,我們在計算機里面表示一種顏色的時候,經常會使用到這樣的一種表示方式叫做RGB那R指的是right,也就是紅色G表示的是green也就是綠色,而B表示的是鹿也就是藍色,因為我們知道自然界里面所有的顏色都是由紅綠藍這三種三原色來按照一定的配比來組成的,比如對于最后這個顏色啊,它的RGB值就分別是102幺三九幺三九一個像素,那有的時候我們存盤一個像素點,它的RGB值的時候,需要把RGB這三個值把它們連成三個位元組的一個整體第1個位元組存放R,第2個位元組存放距第3個位元組存放B的值,而現在我們只是分開指明了這三個部分的值分別是多少,好那來看一下怎么把它們拼成三個位元組的一個整體可以這么做,首先我們啊申請用三個位元組來存盤無符號數102也就是R的值,那現在我們對這個無符號數進行邏輯左移左移16位,這就會導致第8位移動到高8位的位置,然后左移產生的這些空位,我們都是用靈來補充,這是邏輯左移的一個規定,而接下來我們再定義一個三個位元組的無符號數啊,這個數的值是139,那么我們再對這個無符號數進行邏輯左移8位的操作,就會導致原本的第8位被放到了中間的8個位的位置之后我們再用三個字,的直139好,最后我們再把剛才得到的123這三個部分進行一個家法操作,就可以得到三個位元組表示的RGB值,最高的一個位元組表示的是2職,中間表示的是G也就是綠色的值,然后最后表示的是B blue的值啊,那這是邏輯移位的一個應用的小粒子,接下來我們再來看最后一種移位運算叫做回圈移位啊,顧名思義,所謂回圈就是指當我們進行比如說循,這一位的一個應用的小例子,接下來我們再來看,最后一組一位運算叫做回圈移位啊,顧名思義,所謂回圈就是指當我們進行,比如說回圈左移的時候移出來的這一位會被放到我們需要填補的這個空位在移位的時候整個二進制串是進行回圈補位的,這個應該很好理解,那當我們進行回圈右移的時候,是不是也是類似的,從右邊移出來的這一位又會跑到啊應該補充的那個位置去啊,那還有一種比較特殊的回圈移位,就是在近衛衛的這種情況,先來解釋一下什么叫近衛衛,也就照我們標注的CF這一位進位的概念大家都知道了,比如我們對兩個8位的二進制數進行加法操作,那當我們運算到最高位的時候,1+1是=0,往高位進1,但是由于機器資產有限,暫存器里只能保存8個二進制位確實產生了一個金幣因此為了實作超過八位元的這種資料確實產生了一個金幣因此為了實作超過八位元的這種資料的,超過巴位元的這種呃資料的加法計算機硬體里面會包含這樣的所謂的進位的位來記錄一下之前這些低位的運算有沒有產生進位,把這個進位保留下來之后,我們在進行之后的更高自己的運算的時候,就可以得到正確的結果,0+1,再加上剛才保留的這個進位1,然后用這樣的方式我們就可以不斷的往高位啊進行計算好,所以這就是所謂的進位位的一個作用,總之它里面要么存在一個1,要么存了一個0,好,現在當我們考慮上這個進位之后,再進行回圈左移,產生的效果就是這樣的,就是會把原本數值位的最高位把它放到這個進位位這個地方,而原本的這個進位位會來補充出現了空位這個樣子好,這就是帶進位位的回圈左移那帶進位位的,那帶進位位的回圈右移是不是也是類似的?呃,無非就是把末尾的這個低位放到進位位的位置,而原本的進位原本的進位位,把它放到啊最高位出現空缺的這個位置,噢,那這就是所謂的回圈移位,那回圈移位的操作很適合用于把一個資料的高位元組和低位元組進行一個調換,就比如之前我們講過一個例子啊,這個漢字它需要占兩個位元組的啊這個位置,但是我們可以有大端存盤和小端存盤這樣的兩種方式大端存盤就是先存放高位元組再存放低位元組,而小端存盤是先存放B位元組再存放高位元組,那如果說要在大端存盤和小端存盤之間進行轉換,使用回圈移位是不是就很方便?我們可以回圈右移8位或者回圈左移8倍,就可以實作高低位元組的一個調換 We的一個作用我們學習的一位運算其中最長好的是算數的,我們學習了定點數的移位運算,其中最常考的是算術移位啊,當我們進行算術左移移位的時候,相當于成了一個基數,當我們算術右移移位的時候,相當于除以奇數的效果,那原碼砝碼補碼進行移位之后補位的這個策略是不太一樣的,特別是補滿,大家比較容易忘,需要基于理解來記憶,那么邏輯,一味的實作很簡單,無論是左一還是左,一還是右一都補您就可以,之后我們又學習了回圈移位就是用移出去的未來補上空缺的那個位兒,對于帶鏡柜位的回圈移位,就是移出地為我們會把它放到近衛衛的位置,而原來的精神病會補上空缺的那個位置,就是移出地為我們會把它放到近衛衛的位置,而原來的近衛衛會補上空缺的那個位置,那再次強調由于原碼補碼反碼,他們的為數有限,也就是可以表示的數值范圍是有限的,所以在某些情況下,一味并不能精確的等效乘法和除法的一個效果可能會喪失精度,甚至是產生比較大的誤差,好的,那這就是移位操作相關的所有內容,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/202225.html
標籤:其他
