Умножение с использованием побитового

99
09 февраля 2022, 16:20

Имеется функция, которая производит умножение двух чисел.

int mult(int a, int b) {
  int result = 0;
  while (b != 0) {
    if (b & 0x1 == 0x1)
      result += a;
    b >>= 1;
    a <<= 1;
  }
  return result;
  }

нужно переделать ее так, чтобы она принимала значения uint8_t, а возвращала uint32_t. Напрямую заменить не выходит, функция начинает выдавать неверные ответы.

Скажем, есть a = 6, b = 3. И если просто заменить типы, то результат получится 450. Логичного объяснения, почему выдается именно такое число, я не нашел.

Answer 1

Ваш пример с заменой типов у меня работает. Правда, когда начинаю умножать большие числа, он перестает работать. Переполнение происходит, если результат произведения > 511. Поэтому я ввожу временную переменную, которую дальше и сдвигаю влево. Поэтому мои изменения следующие:

uint32_t mult(uint8_t a, uint8_t b) {
    uint32_t result = 0;
    uint32_t tmpA = a;
    while (b != 0) {
        if (b & 0x1 == 0x1)
            result += tmpA;
        b >>= 1;
        tmpA <<= 1;
    }
    return result;
}
READ ALSO
Как получить копию двумерного массива в новый массив на новую область памяти

Как получить копию двумерного массива в новый массив на новую область памяти

Возникла необходимость получить копию первого столбца в двумерном массивеЯ все делаю через указатели, и одномерный и двумерный

98
Процентная ставка по вкладу составляет P процентов годовых. Определите размер вклада через год

Процентная ставка по вкладу составляет P процентов годовых. Определите размер вклада через год

Задача: Процентная ставка по вкладу составляет P процентов годовых, которые прибавляются к сумме вклада в конце годаВклад составляет X рублей...

96
Нужна помощь со вложенным запросом Mysql

Нужна помощь со вложенным запросом Mysql

структура и данные таблицы тут https://pastebincom/u1GY7gvr

154
Извлечь нужные столбцы

Извлечь нужные столбцы

У меня есть запрос:

94