二进制数向量的有效位混洗

时间:2015-08-03 07:23:22

标签: arrays matlab bit-manipulation vectorization

我已经记录了包含位序列矢量的数据,我想有效地重新排列。数据向量中的一个值可能如下所示:

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不能处理位序列的向量。由于我有一个相当大的数据集,我对有效的解决方案感兴趣。

任何帮助将不胜感激,谢谢!

3 个答案:

答案 0 :(得分:3)

dec2binbin2dec可以处理向量,您可以一次输入所有数字并置换矩阵:

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));

如果可以,我会改用de2bibi2de

答案 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)

最有效的方法可能就是在你的问题中使用bitgetbitset,尽管你只需要一个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

您可以使用arrayfunfind根据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