То, что вы ищете, это битовое умножение / деление.
Я не уверен, что могу кратко изложить это, но здесь я приведу пример:
Умножить
Допустим, вы хотите умножить число 6 на число 5.
Если a = число 6, то (в упрощенном 8-разрядном) это:
a=00000110
Если b = число 5, то (в упрощенном 8-битном) это будет:
b=00000101
Чтобы умножить эти числа, вам нужно сместиться на ближайшую кратную двух под цифрой, затем добавить.
Например, ближайшее кратное 2 ниже 5 равно 4, то есть 2 ^ 2;
Таким образом, мы побитно сдвигаемся влево a
(число 6) 2 раза:
a << 2
Который сейчас делает это 00011000
Это означает, что мы теперь умножены на 4; чтобы теперь умножить это на 5, мы просто добавляем a
снова:
00011000
+00000110
=00011110
=30 (base 10)
Что составляет 6 * 5.
Давайте попробуем это снова с 12 * 11
Ближайшее значение, кратное 2 ниже 11, равно 8 (2 ^ 3). Это означает, что нам нужно будет поразрядно сдвинуть число 12 3 раза, а затем добавить его к себе еще 3 раза.
00001100 = 12
//Let's bitshift by 3
01100000 = 96
//Let's add 12 3 times
01100000
+00001100
=01101100 = 108
+00001100
=01111000 = 120
+00001100
=10000100 = 132 = 12*11
Разделить
Чтобы разделить 12 на 11, вы идете другим путем; вычтите 12 из 132, 3 раза, затем сдвиньте вправо 3 раза (для деления на 8)
Соответствующий ресурс (ы)
Это лучшее, что я могу сделать прямо сейчас; если вы хотите больше, с соответствующими алгоритмами на C, взгляните на http://www.programmersheaven.com/mb/CandCPP/295363/295363/bitwise-multiplication--division/
Если вы хотите, чтобы любой из этих ответов был расширен, прокомментируйте ниже;
P.S. Я показал вам два примера с простыми числами (неприятно), но что, если вы получите число, подобное 12?
Логически, исходя из того, что я сказал, ближайшее кратное 2 - это 8 (2 ^ 3), поэтому вам нужно сдвинуть бит влево на 3, а затем добавить 12 к числу 4 раза.
Но если вы выполните математику, вы обнаружите, что 12 на самом деле = (2 ^ 3 + 2 ^ 2) ... что означает, что вы можете получить (12 << 3) (это 12 бит сдвига влево 3 раза ), затем добавьте его в (12 << 2) (это 12 бит сдвига влево 2 раза) ... магия! </p>