---二進制乘--
--二進制乘法是什么原理?_作業幫 https://qb.zuoyebang.com/xfe-question/question/8f969ea92ce2f4a910ad51c9734ac713.html
二進制乘法原理:
就是左移(進位)8次,每次最高位為1則加進去,8位移完就得出乘積了
實際上和我們做10進制的乘法是一樣的,只不過這里的進制是2罷了
比如5×6,轉成二進制就是0101×0110
十進制乘法大家都會做,公式就是
我們他當成十進制101×110來計算下看看
4位乘積=被乘數×千位被+被乘數×百位+被乘數×十位+被乘數×個位
既0101×0110=101×0000+101×100+101×10+101×0
變化下:
4位乘積=被乘數×千位數×1000+被乘數×百位數×100+被乘數×10位數×10+被乘數×個位數
既0101×0110=101×(0×1000)+101×(1×100) +101×(1×10)+101×0
再變化下:
4位乘積=被乘數×千位數×10×10×10+被乘數×百位數×10×10+被乘數×10位數×10+被乘數×個位數
既0101×0110=101×(0×10×10×10)+101×(1×10×10)+101×(1×10)+101×0
=(((101×0)×10)+(101×1))×10+(101×1))×10+101×0
我們可以看到,實際上乘法結果就是被乘數乘以每一位乘以模(10)的N次方的累計和(其實左移位就是進位啦,看得出來嗎?)
而換成2進制的話很簡單,把10讀成二進制2就行了,結果還是:
4位乘積=被乘數×千位數×10×10×10+被乘數×百位數×10×10+被乘數×10位數×10+被乘數×個位數
既0101×0110=101×(0×10×10×10)+101×(1×10×10)+101×(1×10)+101×0
=(((101×0)×2)+(101×1))×2+(101×1))×2+101×0
由於乘2就是移位(進位),把上面的公式中乘2換成左移位就行了
PS:
由於二進制只有0和1,乘2可以用左移一位來實現,也可以“自己加自己”來實現的,很多CPU的左移指令和“自己加自己”一樣
用軟件乘法要耗費很多CPU時間,只要CPU有硬件乘法器,當然是用硬件的了,哪會快很多的.
---二進制除----
---除法運算就是移位和相減_cenzmin的專欄-CSDN博客 https://blog.csdn.net/cenzmin/article/details/47311901
2進制完成除法運算就是移位和相減,比如1011011除以1110順序如下:
1 - 1110 不夠減, 結果添0, 1左移一位再加上原來1后的0,為10 。
10 - 1110 不夠減, 結果添0, 10左移一位再加上原來10后的1,為101 。
101 - 1110 不夠減, 結果添0, 101左移一位再加上原來101后的1,為1011 。
1011 - 1110 不夠減, 結果添0, 1011左移一位再加上原來1011后的0,為10110 。
10110 - 1110 = 1000 結果添1,同上左移加原來10110后的1得 10001 。
10001 - 1110 = 11 結果添1,同上左移加原來101101后的1得 111 。
111 - 1101 不夠減,結果添0,此時1011011所有位都已移完,運算完畢 。
即 1011011 = 1110 * 0000110 + 111 。
也即 91 = 14 * 6 + 7 。
由於你相除的兩個數放在兩個數組中,比如A[]與B[],要模擬這種運算的話就需要能不
斷地從A中取出其二進制的高位,添加到一個當前值的數組C[]中,而實際進
行運算的就是C與B。數組單元的類型必然是多位的,你必須要實現做到對數組C[]左移
一位的操作,剩下的就是判斷C夠不夠減B(即C數組的數是不是比B大)了。
至於左移,我想大家都想到了,其實C和B是倒序存放的,以數組單元為8位為例,
C[0]存放着C的最低8位,用表達式表示就是 C[0] = C & 0xff, C[1] = C & 0xff00, ...
這樣當移位時,只要保留當前單元C[i]的最高位,即h = C[i] > > 7,然后直接對
C[i]左移一位即 C[i] < <1,然后再加上上一單元C[i-1]保留的最高位即得到當前的C[i]
對於C[0]來說,它的上一單元的最高位自然就是A的最高位了。