2020年7月5日 星期日

三倍變十倍? 1,000x3= 10,000? X進制位元數與移位計算



        1000 3倍劵,3000變10,000,3倍券有10倍的效果? 最近常常出現這個話題,本來聽起來很沒道理,後來想想其實挺合理的,只要改成X進位就可以了  。

記數與進位制

        現在平常在用的記數系統大多為10進制,體重(公斤)身高(公分公尺)與交易大部分都是採用10進制,進位系統就跟蘋果裝箱一樣,每個小箱子可以裝10顆蘋果,每個中箱子可以裝10個小箱子這樣以數到9後在+1就進位。
但還是有不同進位系統存在生活當中,例如
一天24小時     24進位
一年12個月    12進位
花甲子60年    60進制            
一分鐘60秒    60進制
算用命八卦      8進制
電腦bit              2進制

        所以當我們在計算乘以幾的時候?,例如2x2=4, 2x7=14都要回憶一下之前背的九九乘法表,但如果任何數乘以10會不加思索的在改數字後面補上0,一樣用蘋果裝箱來思考,如果原本只有2顆蘋果,那乘以10就會變成每一顆蘋果都變成10顆,也就是每顆蘋果都變成1箱蘋果。
1顆 x 10 = 10顆 = 1箱
1顆 x 10 = 10顆 = 1箱

        所以任何進位制的任何數乘以改進位系統就會左移一位,當然反之就是右移一位囉,我們再舉一下例子5487x10=54870就是整個記數往左移一位了。
3倍券有10倍的效果

        但如果我們是活在3進位的系統呢? 查了一下2019年都還有在發表3進位制的電腦Korean researchers develop ternary semiconductor tech (ternary是三位元的意思),但間單一點以剛剛蘋果裝箱的例子也,一小箱只能裝3顆蘋果,一中箱只能裝3個小箱......,所以當我們生活在3位元的世界裡,那麼

1x3就會等於10   😅
(避免誤會通常會講一零,因為大家習慣10進位的計算了,或真的要說就要讀乘3, 20就是二,三 XD,例如常用的16進位如果10也會讀成一零或一,十六 😎)

2位元移位計算Excel VBA 

        其實2位元的移位計算在很多語言中都有標準運算子,例如C語言就是
右移 >>
左移 <<

非常直觀,Excel 2016要做的話就有已經有函數可以支援BITRSHIFT and BITLSHIFT可以直接用,但如果沒有
BITLSHIFT(number, shift_amount)
BITLSHIFT 函數語法具有下列引數。
  • Number    必要。 數字必須大於或等於 0 的整數。
  • Shift_amount    必要。 Shift_amount 必須為整數。
但如果是比較舊的版本那要達成這功能也不難,因為是2位元的系統,所以往左移一位就是乘以2,如果移N位就是乘以2^N
        所以在不考慮溢位等其他問題,透過乘或除2的N次方就可以得到2位元移位的效果。

'向左位移<<
Public Function BitLShit(ByVal Number As Long, ByVal Shift_amount As Long) As Long

Number = Number * 2 ^ (Shift_amount)

BitLShit = Number

End Function
'向右位移>>

Public Function BitRShit(ByVal Number As Long, ByVal Shift_amount As Long) As Long

Number = Number \ 2 ^ (Shift_amount)

BitRShit = Number

End Function


沒有留言:

張貼留言

熱門文章