乘法计算过程的模拟

     //计算123*456
        int[] arr1= {3,2,1};
        int[] arr2= {6,5,4};
        //结果数组
        int[] result=new int[6];
        //进行相乘
        for(int i=0;i<arr1.length;i++)
        {
            for(int j=0;j<arr2.length;j++)
            {
                result[i+j]+=arr1[i]*arr2[j];
            }
        }
       //遍历结果数组进行进位
        for(int i=0;i<result.length-1;i++)
        {
            int temp=result[i];
            //取余保证每位上的数一定是个位数
            result[i]=temp%10;
            result[i+1]+=temp/10;
        }
        //输出结果
        System.out.println(Arrays.toString(result));

 

转载于:https://www.cnblogs.com/xuwangqi/p/11205097.html

### 原码一位乘法计算过程 #### 符号位的确定 符号位通过两个操作数符号位的异或来获得。如果被乘数和乘数均为正,则最终积为正;若一正一负,则积为负[^2]。 #### 数值部分的运算规则 数值部分采用逐位判断的方式进行处理。具体而言: - 对于乘数中的每一位,从最低位开始检查。 - 如果当前位是`1`,那么将被乘数加入到累积的部分积中; - 若该位为`0`,则向部分积中添加零。 - 完成一次相加之后,需将部分积连同剩余未处理的乘数一起逻辑右移一位,以便准备下一轮的操作[^3]。 #### 实际案例分析 假设存在如下情况:被乘数X=-7(即原码表示为10000111),Y=5(即原码表示为00000101)。 1. 初始化设置: - 部分积P初始化为全0(长度等于两倍的数据宽度) - 将乘数加载至寄存器C内 2. 开始迭代循环直至完成所有位次的处理: | 循环次数 | 当前状态 (P, C) | 动作描述 | |---------|--------------------------|----------------------------------| | 初始 | P=00000000 00000000 , C=Y | 准备工作 | | 第1轮 | P=00000000 00000111 , C=0 | Y最右边第一位为1 -> 加入|x|=7 | | | | 右移(P,C)-> P=00000000 00000011 , C=0...| | 第2轮 | P=00000000 00000011 , C=0 | Y倒数第二位仍为0-> 不做任何改变 | | | | 继续执行右移 | | 第3轮 | P=00000000 00000001 , C=0 | Y最高位再次遇到1 | | | | 执行加法并随后继续整体右移 | 3. 结果整理阶段 经过三次完整的循环后,我们得到了未经调整的小数点位置的结果。此时还需要考虑最初设定好的符号位以及可能存在的溢出等问题。对于本例来说,由于输入数据范围较小,不会发生溢出现象。最终结果应为-P=-(35)=11000011,在这里省略了高位多余的零填充[^4]。 ```python def one_bit_original_code_multiplication(x_abs, y_abs): """ 模拟原码一位乘法过程 参数: x_abs -- 被乘数的绝对值 y_abs -- 乘数的绝对值 返回: result -- 计算后的乘积累积值 """ n = max(len(bin(x_abs)), len(bin(y_abs))) - 2 # 获取较长的那个二进制串的有效位宽 partial_product = 0 # 初始化部分积变量 multiplier_copy = y_abs # 复制一份乘数用于后续操作 while multiplier_copy != 0: if multiplier_copy & 1: # 测试乘数最低位是否为1 partial_product += x_abs # 是的话加上对应的被乘数 partial_product >>= 1 # 整体右移一步 multiplier_copy >>= 1 # 同样移动乘数 sign_flag = ((x < 0) ^ (y < 0)) # 根据原始输入确定符号标志 final_result = (-partial_product if sign_flag else partial_product) return final_result ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值