Как умножить int на дробь - PullRequest
       19

Как умножить int на дробь

2 голосов
/ 09 сентября 2011

Мне нужно умножить int на дробь, используя побитовые операторы без циклов и тому подобное.

Например, мне нужно умножить на х на 3/8.

Я думал, что вы:

int value = (x << 1) + x;  // Multiply by 3
value = (value >> 3);          // Divide by 8

Но это не работает.Я пробовал прибегать к двоичной дроби, но это дает примеры с плавающей запятой.Я не знаю точно, если это домашнее задание для плавающей запятой, но моя догадка нет, но готовит меня к этому.Итак, какие-либо предложения?


Мне нужно округлить до нуля, так что какие-либо предложения?Это не работает для номера -268435457.

Ответы [ 3 ]

5 голосов
/ 09 сентября 2011

Вы, вероятно, хотите

int value = (x << 1) + x;
value = (value >> 3);

, отметьте, что:

(x << 1) + 1 = 2*x + 1; // ignoring issues about overflow

Чтобы настроить отрицательные значения, вы можете явно проверить наличие знака:

int value = (x << 1) + x;
value = value >> 3;
value = value + ((x >> 31) & 1); // for 32 bit; for 64 bit you have to use x >> 63
1 голос
/ 09 сентября 2011

Вы пробовали:

int value = (x << 1) + x;  // Multiply by 3
value = (value >> 3);      // Divide by 8

т.е. во втором утверждении замените «х» на «значение». Также значение потеряет десятичные знаки.

0 голосов
/ 10 сентября 2011

Чтобы избежать переполнения, вы можете привести к (long long) и обратно к (int) для окончательного результата.Чтобы >> 3 округлилось до нуля, вам нужно добавить 7 (8-1) для отрицательного числа.Есть несколько способов сделать это.Использование этих подходов дает вам -100663296.

...