利用位运算,乘数每次右移一位,被乘数每次左移一位.#include <iostream>#include <math.h>/*不适用乘号实现乘法*/int multiply(int a, int b) { int res = 0; a = fabs(a); //求绝对值 b = fabs(b); while (a) { int t = a &a...
硬件
乘法
器的意义何在?
乘法
直接乘不就可以了吗。我verilog里编写a*b即可,为什么要移位相加去乘?
你要知道,数字电路中的逻辑是由最基本的与、或、非等基本逻辑组合而成的,并不能直接生成乘除等复杂
运算
。
乘法
运算
是由与、或、非等基本逻辑组合而成的,如下图所示是
乘法
器内部结构图:
(AX)=0001H (CX)=00FFH
MUL CL //无符号数的8位相乘 01H*FFH -> (AX)=00FFH
MUL CX //无符号数的16位相乘 0001H*00FFH 变成32位数据 = 0000 00FFH 前八位放在16位放在DXA里边,后16位放在AX里边 及(DX:AX)=0000 00FFH
有符号数的计算类似于上
二、除法
指令
1.无符号数DIV
2.有符号数IDIV
int MySystem::Multi(int x1, int x2)
//先将其转换为大数,因为INT_MAX 的绝对值不能转换为INT_MIX,转换的结果的为INT_MAX+1,这将导致正溢出,变为负值 INT_MIN
long long Lx1 = static_cast(x1);
long long Lx2 = static_cast
虽然我们在编程语言中可以直接
使用
+-/,但是对某些要求不能用/的情况下,我们有必要了解一下计算机是怎样完成乘除法的。
首先,我们要明确一下计算机所能完成的最基本操作是:+(-)和左移右移。虽然ISA中一般都有MUL类
指令
,但是这些经过译码之后最终的元操作还是加法和移位
指令
。
乘法
实现
我们知道在计算机中只有0和1,于是,就有了二进制计数,比如5 = 101. 抽象的说,任何一个数均可以表示为如