我已经记录了包含位序列矢量的数据,我想有效地重新排列。数据向量中的一个值可能如下所示:
bit0, bit1, bit2, ... bit7
我想按顺序重新安排这个位序列:
bit0, bit7, bit1, bit6, bit2, bit5, bit3, bit4
如果我只有一个值,这可以很好地通过:
sum(uint32(bitset(0,1:8,bitget(uint32(X), [1 8 2 7 3 6 4 5]))))
不幸的是,bitset和bitget不能处理位序列的向量。由于我有一个相当大的数据集,我对有效的解决方案感兴趣。
任何帮助将不胜感激,谢谢!
答案 0 :(得分:3)
dec2bin
和bin2dec
可以处理向量,您可以一次输入所有数字并置换矩阵:
input=1:23;
pattern = [1 8 2 7 3 6 4 5];
bit=dec2bin(input(:),numel(pattern));
if size(bit,2)>numel(pattern)
warning('input numbers to large for pattern, leading bits will be cut off')
end
output=bin2dec(bit(:,pattern));
如果可以,我会改用de2bi
和bi2de
。
答案 1 :(得分:1)
我不知道我是否可能会错误地提出这个问题,但是它是否只能通过索引包装到cellfun
来解决?
%// example data
BIN{1} = dec2bin(84,8)
BIN{2} = dec2bin(42,8)
%// pattern and reordering
pattern = [1 8 2 7 3 6 4 5];
output = cellfun(@(x) x(pattern), BIN, 'uni', 0)
或者您输入的格式和所需的输出是什么?
BIN =
'01010100' '00101010'
output =
'00100110' '00011001'
答案 2 :(得分:0)
最有效的方法可能就是在你的问题中使用bitget
和bitset
,尽管你只需要一个8位整数。假设您有一个uint8
数组X
来描述您的记录数据(例如下面的X = uint8([169;5])
,没有特殊原因。我们可以通过创建一个有用的匿名函数来检查这些位:< / p>
>> dispbits = @(W) arrayfun(@(X) disp(bitget(X,1:8)),W)
>> dispbits =
@(W)arrayfun(@(X)disp(bitget(X,1:8)),W)
>> dispbits(X)
1 0 0 1 0 1 0 1
1 0 1 0 0 0 0 0
并假设您有一些模式pattern
,根据该模式,您要重新排序存储在此整数向量中的位:
>> pattern
pattern =
1 8 2 7 3 6 4 5
您可以使用arrayfun
和find
根据pattern
对位进行重新排序:
Y = arrayfun(@(X) uint8(sum(bitset(uint8(0),find(bitget(X,pattern))))), X)
Y =
99
17
我们在8位整数的向量中有效地存储了所需的答案:
>> class(Y)
ans =
uint8
>> dispbits(Y)
1 1 0 0 0 1 1 0
1 0 0 0 1 0 0 0