計算機領域,負數常用二補數表示。
很多計算機書籍有介紹二補數,不再贅述。
這裡討論的是:把一個二補數,除以一個數 K,或對 K 取 Mod,得到的答案意義為何?
首先,二補數可視為 2^N ( 2 的 N 次方)減一純量,N 視為無窮大。
例如:-3
二補數表示法為:2^N - 3
二進位表示:(100000000...) - (11)
將 2^N 除以 K 取商,餘數丟棄,K 是 2 的冪次方(2, 4, 8, 16...),此商在數線上意義為何?
把 2^N 看成無窮多個班級所組成的人數,每班 K 人。由於 K 是 2 的冪次方,所以 2^N 人剛好能排滿 n 個班級,n 剛好也是 2 的冪次方:
K | K | K | K | ... | K | K |
做以下觀察:
- 任意正數 P ,(2^N - P) 是 -P 的二補數表示法。
- (2^N - P) / K = n - Q = 2^某次方 - Q,是 Q 的二補數。
- Q = ceiling(P/K),也就是假如 P/K = 3.45,那麼 Q 就是 3.45 進位 = 4。
- 所以 2^某次方 - Q 就是 - ceiling(P/K) 的二補數表示。
- (2^N - P) % K,也就是取模數,為 K - (P%K) = 1。
結論:
- 二補數除以 K,K 為 2 的冪次方,商還是二補數。
- 二補數 Mod K,即取模數,K 為 2 的冪次方,得到的結果,是一個純量,這個純量不是二補數。
- 二補數除以 K,K 為 2 的冪次方,跟正數除以 K 的意義有一樣的地方,算出的商為一個編號,代表第幾個班級,班級的編號從 0 開始。
例如:P = 第 0, 1, 2, ... , K-1 個同學,被編在編號為 P/K = 0 的班級,P = 第 K+0, K+1, K+2, ... , 2K-1 被編在編號為 P/K = 1 的班級。
同理,P = -1, -2, -3, ... , -K 的同學,屬於編號為二補數 (-P)/K = -1 的班級,-K-1, -K-2, -K-3, ... , -2K 屬於在編號為 -2 的班級。 - 二補數 (-P) % K,跟正數 P % K 行為意義有一樣的地方。
假設 K = 8 ,即每 8 個人一班,每班學號從 0 開始到 7,假設 P 等於 15, P/K = 1,P % K = 15 % 8 = 7,代表第 15 人(0-based index)屬於編號為 1 的班級,且學號為 7 的同學。
同理,二補數 (-15)/K = -2,二補數 (-15)%K = 1,所以由 0 開始倒著數,第 -15 個同學屬於編號為 -2 的班級,學號為 1 。
也許很難理解吧,但熟悉一下就會發現其中的奧秘,二補數除法,有時候可以增加運算的效率。
留言
張貼留言