필터 지우기
필터 지우기

Extracting representative bits for an integer and doing the reverse.

조회 수: 3 (최근 30일)
I have an integer value and want to extract all its representative bits in two-bit blocks; each block consists of two bits. Reversely, I want to build an integer value from given two-bit blocks. What is the more optimized code performing these tasks?

채택된 답변

Digitalsd
Digitalsd 2012년 11월 20일
편집: Digitalsd 2012년 11월 20일
For Positive integer Values,By the use of bitwise operations, and,or,shift:
% Decomposition:
a=4235; % any Positive Integer <= 65535 : Up to 2byte.
a1=a;
block=[0,0,0,0,0,0,0,0];
for k=1:8
block(k) = bitand(a1, 3);
a1 = bitshift(a1, -2);
end
% Reversely: The Composition
% We have the resulted block.
b=0; % Integer
for k=1:8
b = bitshift(b, +2);
b = bitor(b,block(9-k));
end
comp=isequal(a,b);

추가 답변 (1개)

Image Analyst
Image Analyst 2012년 11월 18일
편집: Image Analyst 2012년 11월 18일
% Say, for 171 = AB = 10101011.
str = dec2bin(171)
theBlocks = reshape(str, [2 4])'
In the command window:
str =
10101011
theBlocks =
10
10
10
11
To reconstruct from theBlocks:
reconstructedString = reshape(theBlocks', [1 8])
reconstructedInteger = bin2dec(reconstructedString)
In the command window:
reconstructedString =
10101011
reconstructedInteger =
171
Is that what you mean?
  댓글 수: 8
Walter Roberson
Walter Roberson 2012년 11월 19일
I'm pretty sure that the poster is trying to do base 4 encoding / decoding.
Digitalsd
Digitalsd 2012년 11월 19일
The answer of image analyst was close to what I wanted but it gives the smaller elements in string type: ‘00’,’01’,’10’,’11’. Instead I need these elements as integer: 0, 1, 2, and 3. In other words I want to decompose the integer to smaller representative integers each has two bits, and from these small integers I can reconstruct the original big integer. To Walter Roberson, it is positive integer. Anyway, I’ve written and tested a code doing exactly what I need,it is done using the bitwise operations, and,or,shift:
% Decomposition:
a=4235; % any Integer <= 65535 : Up to 2byte.
a1=a;
block=[0,0,0,0,0,0,0,0];
for k=1:8
block(k) = bitand(a1, 3);
a1 = bitshift(a1, -2);
end
% Reversely: The Composition:
% We have the resulted block.
b=0; % Integer
for k=1:8
b = bitshift(b, +2);
b = bitor(b,block(9-k));
end
comp=isequal(a,b);
Best Regards

댓글을 달려면 로그인하십시오.

Community Treasure Hunt

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

Start Hunting!

Translated by