下面概述了从多个位置向位移位二进制数的想法。我首先将此问题表述为零填充问题here但我现在开始觉得可能有一个优雅的bithift解决方案。我可以进行比特移位,例如bitshift(5,1)
101
到1010
但是如何从特定位执行此操作?例如,某个位的101
从第二位开始移位,以便101
到1001
?
从特定位置开始转移
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
如何从二进制数字中的特定位置开始比特移位?
答案 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);
关于你的“从很多地方开始多次转移”请求我真的不明白为什么这与你之前的问题有所不同。