ОБНОВЛЕНИЕ: Я взял размещенный ниже код и усовершенствовал его до полной функции с проверкой ошибок, справочной документацией и возможностью работать с массивами неподписанных целые числа и переменные двойной точности, как и встроенная функция BITSHIFT . Я предлагаю использовать более новую версию, на которую я ссылаюсь выше, вместо более старой версии, опубликованной ниже.
MATLAB не имеет встроенной функции вращения битов, а функция BITSHIFT будет сбрасывать биты, которые переполняются. Тем не менее, вы можете реализовать свою собственную функцию поворота битов на основе существующих битовых операций . Вот простая версия первого прохода, которую я скинул (без проверки ошибок):
function data = bit_rotate(data,nBits)
dataBits = log2(double(intmax(class(data)))+1); %# Number of bits in data
nBits = rem(nBits,dataBits); %# No need to rotate by dataBits bits or more
if nBits == 0 %# No bit rotation needed, just return
return
end
shiftedData = bitshift(data,nBits); %# Bit shift the data
lostData = bitxor(data,bitshift(shiftedData,-nBits)); %# Find the lost bits
rotatedData = bitshift(lostData,nBits-sign(nBits)*dataBits); %# Rotate them
data = shiftedData+rotatedData; %# Add the rotated bits to the shifted bits
end
А вот некоторые тестовые данные:
>> B = uint8(208); %# An unsigned 8-bit integer value
>> disp(dec2bin(B,8)) %# Display the bit pattern of B
11010000
>> disp(dec2bin(bit_rotate(B,2),8)) %# Rotate left by 2 bits
01000011
>> disp(dec2bin(bit_rotate(B,-2),8)) %# Rotate right by 2 bits
00110100
Обратите внимание, что bit_rotate
также будет работать с матричным входом любого размера для data
, пока это целочисленный тип без знака.