大家好,欢迎来到IT知识分享网。
二进制乘除法原理
计算机所能完成的最基本操作是加减法和左右移。
虽然ISA中一般都有MUL类指令,但是这些经过译码之后最终的元操作还是加法和移位指令。
二进制乘法
假设不能使用乘除运算求a×b的结果,当a=b=123时,最直接的方法是通过88个88相加。但是,我们不难发现这样的规律:
123 × 123 = (100+20+3)×123 = (100×123) + (20 × 123) + (3 × 123)
因此,我们需要进行计算的次数为min(len(a), len(b))
。
根据这个原理,不难想出二进制的乘法运算:
0011 * 1001 = ( 0011 * 1000)+( 0011 * 0001)
注意,这时应该使用位移运算来取代乘法运算:
0011*1000 => 3<<3
0011 * 0001 => 3<<0
//不用乘除做整数乘法运算
int Mult(int a, int b){
int ans = 0;
for (int i = 0; i < 32; i++){
ans += ( b & (1 << i) ? a << i : 0);
}
return ans;
}
二进制除法
二进制除法的原理与在十进制时差不多,但实现起来要比二进制乘法稍微复杂一些,先上一个例子(38除以6等于6余2):
我们从被除数的最高位开始,每步循环结束后被除数必定小于除数,然后通过位移的方式让被除数长度加1。
No. | 运算 | 结果 | 余数 |
---|---|---|---|
1 | 1/110 | 0 | 1 |
2 | 10/110 | 0 | 10 |
3 | 100/110 | 0 | 100 |
4 | 1000/0110 | 1 | 011 |
5 | 0111/0110 | 1 | 1 |
6 | 10/110 | 0 | 1 |
(个位数,循环结束) |
//二进制除法运算
int Dvi(int a, int b){
int ans = 0;
for (int j = 31; j >= 0; j--){
int tmp = a >> j;
if (tmp >= b){
ans = ans | (1 << j);
a -= (b << j);
}
}
return ans;
}
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/20729.html