从二进制数字的特定位开始的Bitshift?

时间:2013-12-30 13:19:46

标签: matlab bit-manipulation

下面概述了从多个位置向位移位二进制数的想法。我首先将此问题表述为零填充问题here但我现在开始觉得可能有一个优雅的bithift解决方案。我可以进行比特移位,例如bitshift(5,1) 1011010但是如何从特定位执行此操作?例如,某个位的101从第二位开始移位,以便1011001

从特定位置开始转移

myBinary=de2bi(23);      %bits in increasing order, bi2de format from DEC number
                         %23=11101(BI decreasing), BI_bi2de=10111(increasing)

shiftAmount=3;           %amount to shift the bits
threshold=3;             %bits shifted in the increasing order from threshold

%Correct result:
%10111 --> 10'111 ---> 10000111 (shifted 3 times from the threshold 3)

tail=myBinary(1:threshold);
myBinary(1:threshold)=[];
myBinary=[zeros(1,shiftAmount),myBinary];
myBinary=[tail, myBinary] %in increasing order
myBinary=flip(myBinary)   %in decreasing order

从多个地点开始多次转移

  

从10010到11然后再回到10010,最后一步需要3位移位。因此,零可以存储为[0,2,3],以便从11到10010返回。我的想法是多次使用上面的'One shifting'方法,但感觉这里可能有更简单的解决方案。

11--- bit 0 onwards ---> 110 
  --- bit 1 onwards ---> 1010 
  --- bit 3 onwards ---> 10010

  

如何从二进制数字中的特定位置开始比特移位?

2 个答案:

答案 0 :(得分:1)

使用遮罩将输入分成“移动部分”和“静止部分” 移动“移位部分”,然后使用bitor操作重新组合数字:

function out = bizarreBitShift( bNum, fromBit, shiftAmount )
% construct a mask
msk = uint32( (2^( fromBit - 1 ) )-1 ); 
shiftPart = bitand( uint32(bNum), bitcmp(msk) ); % bitcmp - complement of bits
staticPart = bitand( uint32(bNum), msk );
out = bitshift( shiftPart , shiftAmount );
out = bitor( out, staticPart );

答案 1 :(得分:0)

这两行怎么样:

a = [ 1 0 1 0 1]
pos = 3;   %counting started with 0 from the right
n = 1;     %number of shifts

b = de2bi( 2^(pos+n)*bi2de( a(1:end-pos) ,'left-msb' ) ,'left-msb' );
b(end-pos+1:end) = a(end-pos+1:end);

返回:

b =

     1     0     0     1     0     1

pos = 1以及pos = 2

b =

     1     0     1     0     0     1

如果您按照Matlab的相同方式计算您的位数,从左到右,右侧最重要的位,代码就更容易了:

b = de2bi( 2^(pos+n)*bi2de( a(pos+1:end) ) );
b(1:pos) = a(1:pos);

关于你的“从很多地方开始多次转移”请求我真的不明白为什么这与你之前的问题有所不同。