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 Kommentare

Walter Roberson
Walter Roberson am 5 Sep. 2019
The most efficient way is to use a pre-calculated lookup table.
For left rotation by 1 bit, if the value is < 128 then multiply it by 2. If it is >= 128 then subtract 128, multiply by 2, and add 1.
sadiqa ilyas
sadiqa ilyas am 5 Sep. 2019
If I have 10100110
1 bit rotaion is 01001101
3 bit rotation is 00110101
and maybe I need 7 bit rotaion so will your
suggestion applicable? I have not used you method before thats why I want to clear the concept
function result = rotate_left_n(value, n)
result = value;
for K = 1 : n
result = rotate_left_1(result);
end
end
sadiqa ilyas
sadiqa ilyas am 5 Sep. 2019
It gives error in line
result = rotate_left_1(result);
Walter Roberson
Walter Roberson am 5 Sep. 2019
It is probably waiting for you to define a function rotate_left_1 according to the algorithm I suggested
sadiqa ilyas
sadiqa ilyas am 6 Sep. 2019
thanks

Melden Sie sich an, um zu kommentieren.

 Akzeptierte Antwort

Bruno Luong
Bruno Luong am 5 Sep. 2019
Bearbeitet: Bruno Luong am 5 Sep. 2019

0 Stimmen

% 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

Weitere Antworten (0)

Community Treasure Hunt

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

Start Hunting!

Translated by