2013-04-19 3 views
0

У меня есть две переменные (которые на самом деле являются элементами двух разных матриц). Например, я хочу умножитьУмножение двух переменных с использованием операции сдвига бит

a[i][k]*b[k][j] 

используя бит-манипуляции, как я могу это сделать.

Я видел ссылки на множимые константы, а не такие переменные, как 3 * 2, 3 * 4, 3 * 8 и т. Д. Но как я могу применять одни и те же методы для умножения переменных? Если сообщение об этом существует, вы можете указать на это. Благодаря!

+3

Было бы очень неэффективно *. Есть ли причина * почему * вы хотите использовать смещение битов? –

+0

Зачем вам это нужно? – Henrik

+0

У меня есть матричные записи размером 100000x1000000. Я хочу ускорить реализацию –

ответ

2

Умножение битового сдвига можно использовать только при умножении на мощность 2 (2, 4, 8, 16 и т. Д.). Умножение затем будет сокращена до одной операции побитового сдвига:

x1 = 2^n; 
    result = x2 << n; // This is the same as x2 * x1 

Для любых случаев, наиболее эффективным способом является использование нормального размножения:

a[i][k]*b[k][j] 
+0

О, это слишком плохо! Я слышал от своего профессора, что умножение через сдвиг бит наиболее эффективно. Он ничего не сказал о умножении по силе 2. –

+3

@ JustinCarrey. Ваш профессор должен также упомянуть, что современные компиляторы автоматически выполняют смещение бит, когда оно более эффективно. –

+0

Я думаю, что моя проблема здесь решена. Отказ от подхода бит-сдвига :) –

6

Учитывая два интегральных переменных

unsigned X, Y; 

И учитывая Commodore 64, Apple] [или какую-либо другую архитектуру, которая не имеет своей собственной команды умножения, это умножит числа.

unsigned answer = 0; 
while (X) 
{ 
    answer <<= 1; 
    if (X & 1) 
    answer += Y; 
    X >>= 1; 
} 
+0

Вместо того, чтобы проходить через эти циклы, и если возникают условные ветви и прыжки, я думаю, что это будет эффективно, если мы умножим их непосредственно –

+3

@JustinCarrey Me. :) –

1

Если вы умножаете огромные матрицы, то имеет значение эффективный алгоритм, который имеет хорошее поведение в кэше. Для C++, проверьте the Eigen library. На современном процессоре вы не можете микро-оптимизировать умножение двух переменных.

Смежные вопросы