不使用任何算术运算符将两个整数相乘

问题描述

我已经设法在不使用任何算术运算符的情况下加减两个整数。我尝试了乘法将两个整数相乘的方法,但似乎无法取得任何进展。如何在不使用任何算术运算符的情况下将两个整数相乘?不能使用的算术运算符是 (+,++,+=,-,--,-=,∗,/,%)。同样从给出的指示是“取产品的最低 16 位应该是 存储在产品中,并且完整的产品应作为 32 位值存储在 full_product 中。” 方法中注释掉的行是为了告诉您不该做什么。谢谢!这是在 C 中完成的代码

#include "alu.h"

/* Adds the two arguments and stores the sum in the return structure's result
 * field.  If the operation overflowed then the overflow flag is set. */
addition_subtraction_result add(uint16_t augend,uint16_t addend) {
    addition_subtraction_result addition;
    while (addend != 0){
      int carry = augend & addend;
      augend = augend ^ addend;
      addend = carry << 1;
    }
    addition.result = augend;
    //addition.overflow = false;
    return addition;
}

/* Subtracts the second argument from the first,stores the difference in the
 * return structure's result field.  If the operation overflowed then the
 * overflow flag is set. */
addition_subtraction_result subtract(uint16_t menuend,uint16_t subtrahend) {
    addition_subtraction_result subtraction;
    while (subtrahend != 0 ){
      int borrow = (~menuend) & subtrahend;
        menuend = menuend ^ subtrahend;
        subtrahend = borrow << 1;
    }
    subtraction.result = menuend;
    return subtraction;
}

/* Multiplies the two arguments.  The function stores lowest 16 bits of the
 * product in the return structure's product field and the full 32-bit product
 * in the full_product field.  If the product doesn't fit in the 16-bit
 * product field then the overflow flag is set. */
multiplication_result multiply(uint16_t multiplicand,uint16_t multiplier) {
    multiplication_result multiplication;
    //multiplication.product = multiplicand * multiplier;         // THIS IS disALLOWED
    //multiplication.full_product = multiplicand * multiplier;    // THIS IS disALLOWED
                          
    multiplication.product = multiplicand;
    multiplication.full_product = multiplicand;
    return multiplication;
}

解决方法

总体思路(类型故意不正确,您无法复制/粘贴回):

uint16_t multiply(uint8_t multiplicand,uint8_t multiplier)
{
    uint16_t result = 0;
    for (int i = 0; i < CHAR_BIT * sizeof(multiplier); i++)
        if (multiplier & (uint8_t))
            result = add(result,(uint16_t)multiplicand << (uint16_t)i);
    return result;
}

但这对你来说还行不通,因为你还没有很长时间添加。我们需要像这样分解长添加:

uint16_t addlong(uint8_t addend1a,uint8_t addend1b,uint8_t addend2a,uint8_t addend2b)
{
    struct addend_result a = add(addend1a,addend2a);
    struct addend_result b = add(addend2a,addend2b);
    if (a.carry) b = add(b.result,1);
    return a.result | ((uint16_t)b.result << 8);
}

所以这些是构建所需的部分。使它们适应您实际拥有的框架和您实际拥有的类型宽度。

由于愚蠢,您必须在乘法中展开 for 循环。这意味着你得到 16 行,因为你的输入大小是 16 位。