高效面試之理解編碼

2021-06-26 13:55:11 字數 2472 閱讀 2534

一.補碼

1.為什麼要使用原碼,反碼,補碼

1)負數二進位制怎麼表示?

答:在原碼中,高位為1就表示負數

2)計算機如何實現減法?

1-1=?

答:對於計算機,邏輯運算應該設計的簡單,1-1可以表示為1+(-1),故沒有減法,用加法實現減法。

1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2

如果用原碼表示,

讓符號位也參與計算, 顯然對於減法來說, 結果是不正確的.

這也就是為何計算機內部不使用原碼表示乙個數.

為了解決原碼做減法的問題, 出現了反碼:

計算十進位制的表示式: 1-1=0

1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0

3)0的二進位制怎麼表示,+0和-0有區別嗎?

答:+0和-0,

但是補碼都為0,計算機中使用的是補碼,故計算機中無+0和-0區分

理由:+0的原碼,反碼,補碼,都是00000000 

-0的原碼是10000000反碼是11111111 ,

而補碼是00000000

補碼解決了0的符號的兩個編碼的問題:

1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 

= [0000 0001]補 + [1111 1111]補 = [0000 0000]補=[0000 0000]原=0

4)8位,-128的原碼是多少?

答:-128沒有原碼,原碼的表示範圍為

[-127, +127], 

計算機用補碼表示,由於去掉了-0, [1000 0000]補 就是-128. 

可以表示用來表示最小值-128,補碼的表示範圍為

[-128, 127]

2.為什麼左移是邏輯運算,右移是算術運算

左移是邏輯運算,右移是算術運算

邏輯移位是連標誌位(正負號)一起操作的,所以可能會改變正負號。

而算術移位是固定好標誌位,移動其他的位,不會改變正負號,但前面被移動的位是補0還是補1,如果標誌位是1,則都補1,是0,則都補0。

答:如果負數右移補0,一是負數變為了正數,補1的話,由於計算機都是補碼表示,由於恰到好處

3.左移等於*2,右移等於/2,對負數也適合嗎

答:是適合的,原來理解錯誤,是由於從原碼角度考慮了,沒有從補碼角度考慮,計算機是用補碼進行運算的。輸出的進製數也是補碼。

本例int是32位,4位元組,所以16進製制共8位

二,字元編碼

1. ascii碼

上個世紀60年代,美國制定了一套字元編碼,對英語字母和一些常見符號進行編碼,只需要乙個位元組來做編碼。這被稱為ascii碼,一直沿用至今。

2、非ascii編碼

英語用128個符號編碼就夠了,但是用來表示其他語言,128個符號是不夠的。

漢字就多達10萬左右。乙個位元組只能表示256種符號,肯定是不夠的,就必須使用多個位元組表達乙個符號。比如,簡體中文常見的編碼方式是gb2312,使用兩個位元組表示乙個漢字,所以理論上最多可以表示256x256=65536個符號。

ansi

使用 2 個位元組來代表乙個字元的各種漢字延伸編碼方式,稱為 ansi 編碼。在簡體中文系統下,ansi 編碼代表 gb2312 編碼,在日文作業系統下,ansi 編碼代表 jis 編碼。

3、unicode

可以想象,如果有一種編碼,將世界上所有的符號都納入其中。每乙個符號都給予乙個獨一無二的編碼,那麼亂碼問題就會消失。這就是unicode,就像它的名字都表示的,這是一種所有符號的編碼。

第乙個問題是,如何才能區別unicode和ascii?計算機怎麼知道三個位元組表示乙個符號,而不是分別表示三個符號呢?

第二個問題是,我們已經知道,英文本母只用乙個位元組表示就夠了,如果unicode統一規定,每個符號用三個或四個位元組表示,那麼每個英文本母前都必然有二到三個位元組是0,這對於儲存來說是極大的浪費

問題一:bom

問題二:變長編碼方式

utf-8是unicode的實現方式之一,它是一種變長的編碼方式

第乙個位元組在前,就是"大頭方式"(big endian),第二個位元組在前就是"小頭方式"(little endian)。

根據前幾個位元組可以判斷unicode字符集的各種編碼,叫做byte order mask方法bom:

utf-8: efbbbf 

utf-16 big endian:feff 

utf-16 little endian:fffe 

utf-32 big endian:0000feff 

utf-32 little endian:fffe0000 

不帶bom的uft-8檔案只有通過utf-8編碼的規則來嘗試辨別。

python之理解 遞迴

古之欲明明德於天下者,先治其國 欲治其國者,先齊其家 欲齊其家者,先修其身 欲修其身者,先正其心 欲正其心者,先誠其意 欲誠其意者,先致其知,致知在格物。物格而後知至,知至而後意誠,意誠而後心正,心正而後身修,身修而後家齊,家齊而後國治,國治而後天下平。這是從林海峰部落格裡面copy的。很好的解釋了...

冒泡,快速,選擇排序之理解

冒泡演算法 思路 在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即 每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換 最簡單的冒泡演算法 n個數,比較 n 1 次,而隨著比較的次數的增加,每次要進行比較...

Python程式設計之理解物件

1 python中的函式和類均是物件,體現在以下幾方面 1 都可以賦值給乙個變數 2 可以新增到集合物件中 3 可以作為引數傳遞給函式 4 可以當作函式的返回值 如果乙個函式沒有return語句,則預設返回none 2 type,class,object之間的關係 我們在python中定義的所有cl...