Azzera filtri
Azzera filtri

how to do left and right bit rotation

4 visualizzazioni (ultimi 30 giorni)
Hi. I am trying to convert a matrix into 8 bit binary and then want to apply different bit rotations in different rows.e.g for row 1, 2bits will be rotated right and for row 2, 3 bits right rotation.
M=[2 32 45;3 54 12 98;134 245 69];
m1=(str2num(dec2bin(M)));
m=reshape(m1,[3 3]);
mm=m(:);
disp(dec2bin(bit_rotate(m,1),8))% error in this line.
%bitrotation function
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
  6 Commenti
Walter Roberson
Walter Roberson il 5 Set 2019
It is probably waiting for you to define a function rotate_left_1 according to the algorithm I suggested

Accedi per commentare.

Risposta accettata

Bruno Luong
Bruno Luong il 5 Set 2019
Modificato: Bruno Luong il 5 Set 2019
% Test example, 166 corresponds to your example of binary '10100110'
M=[2 32 45;
3 54 166;
134 245 69]
rotfun = @(M,r) reshape(str2num(circshift(dec2bin(M,8),-r,2)),size(M))
rotfun(M,0)
rotfun(M,3)
Results:
ans =
10 100000 101101
11 110110 10100110
10000110 11110101 1000101
ans =
10000 1 1101001
11000 10110001 110101
110100 10101111 101010

Più risposte (0)

Categorie

Scopri di più su MATLAB in Help Center e File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by