#matlab #bit-manipulation
#matlab #манипулирование битами
Вопрос:
Я хочу оптимизировать эту функцию Matlab, которая выполняет поворот бит влево для числа uint64
function Sh_x = ROL(x, nShift)
i = 1;
while i <= nShift
y=reshape(dec2bin(typecast(swapbytes(x),'uint8'),8).',1,[]);
bit = double(y(1))-48;
x = bitset(x,64,0,'uint64');
Sh_x = uint64(bitshift(x, 1,'uint64'));
Sh_x = Sh_x uint64(bit)* uint64(2)^0;
x = Sh_x;
i = i 1;
end
end
Комментарии:
1. Я почти уверен, что вы можете заменить
uint64(2)^0
константой.
Ответ №1:
bitshift(x, nShift, 'uint64')
сдвигает 64-разрядное целое число влево на nShift
значения, отбрасывая биты, которые переполняются с левой стороны, и добавляя нули с правой стороны. Это приводит к левому компоненту ожидаемого результата. Чего вам не хватает, так это бит, которые переполнились слева.
bitshift(x, nShift-64, 'uint64')
сдвигает 64-разрядное целое число вправо на 64-nShift
значения, отбрасывая значения, которые заканчиваются справа, и добавляя нули слева. Оставшиеся биты — это те, которые вышли влево при первом сдвиге влево. Это приводит к правильному компоненту ожидаемого результата.
Объедините два с помощью bitor
:
Sh_x = bitor(bitshift(x, nShift, 'uint64'), ...
bitshift(x, nShift-64, 'uint64'), ...
'uint64');
Комментарии:
1. И это для поворота вправо:
p2 = bitor(bitshift(x, -nShift, 'uint64'), ... bitshift(x, 64-nShift, 'uint64'), ... uint64');
2. @Naseem: Да, действительно, длина сдвига в обоих
bitshift
вызовах должна быть отрицательной.