Есть ли какой-либо более быстрый способ выполнить поворот бит влево для uint64 в Matlab

#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 вызовах должна быть отрицательной.