How can I apply circular shift on bits in MATLAB?

 채택된 답변

Youssef  Khmou
Youssef Khmou 2013년 4월 12일

1 개 추천

hi,
suppose you have a vector a=011000011, then shift circularly the vector :
b=circshift(a,[1 1]), % if 1 is >0 then the vector is shifted the right
b=circshift(a,[1 -1])
b=circshift(a,[1 2]),
...

추가 답변 (1개)

Walter Roberson
Walter Roberson 2013년 4월 11일

1 개 추천

MATLAB does not offer that operation directly.
You can extract the bits that would be shifted "off the bottom", do the shift, and then put the bits back on top. Or you can proceed numerically, such as
mod(x,2)*2^7 + floor(x/2)

댓글 수: 7

okie if in binary a=011000011 then how can I perform the first method??
Thank you!
what is the numerical function for circular left shift?
Supposing your array is named YourMatrix, and each of the values is to individually be left-shifted by K bits, then:
vc = class(YourMatrix);
switch vc
case 'int8'; uc = 'uint8'; wl = 8;
case 'uint8'; uc = 'uint8'; wl = 8;
case 'int16'; uc = 'uint16'; wl = 16;
case 'uint16'; uc = 'uint16'; wl = 16;
case 'int32'; uc = 'uint32'; wl = 32;
case 'uint32'; uc = 'uint32'; wl = 32;
case 'int64'; uc = 'uint64'; wl = 64;
case 'single'; uc = 'uint32'; wl = 32;
case 'double'; uc = 'uint64'; wl = 64;
otherwise; error('YourMatrix is not numeric, is class %s', vc);
end
uMatrix = typecast(YourMatrix, uc);
shifted_uMatrix = bitshift(uMatrix, K, uc) + bitshift( uMatrix, K-wl, uc);
shifted_YourMatrix = typecast(shifted_uMatrix, vc);
... As you can probably see, the process would be much simpler if you were to ask about one particular data type.
If I give a matrix, then how should I get a matrix, where all elements should be circularly left shifted? Is there any numerical function "mod(x,2)*2^7 + floor(x/2)" like this?
Do you want the individual bits to be left shifted, or do you want the elements to be left shifted relative to the other elements? For example if you had A = uint8([1 2 3 129]) to be circular left shifted by 2, then do you want the result B = uint8([3 129 1 2]) or do you want the result B = uint8([4, 8, 12, 6]) ?
If you want the elements to be left shifted relative to each other, then
B = circshift(A, -K, 2);
If you want the bits to be circular shifted, then use the code I posted above (which I made a couple of corrections to a moment ago.)
If you want the bits to be circular shifted and you want the operation to be expressed mathematically, it is possible. In the above code, replace
shifted_uMatrix = bitshift(uMatrix, K, uc) + bitshift( uMatrix, K-wl, uc);
with
shifted_uMatrix = mod(uMatrix, 2^(wl-K)) * 2^K + uMatrix ./ 2^(wl-K);
Thank You!

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

카테고리

도움말 센터File Exchange에서 Coordinate Transformations에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by