2015-08-03 10 views
5

Ho registrato dati contenenti un vettore di sequenze di bit, che vorrei riordinare in modo efficiente. Un valore nel vettore di dati potrebbe essere la seguente:Efficente rimescolamento di bit del vettore di numeri binari

bit0, bit1, bit2, ... bit7 

Vorrei ri-organizzare questo bit-sequenza in questo ordine:

bit0, bit7, bit1, bit6, bit2, bit5, bit3, bit4 

Se avessi un solo valore questo dovrebbe funzionare piacevolmente via:

sum(uint32(bitset(0,1:8,bitget(uint32(X), [1 8 2 7 3 6 4 5])))) 

Sfortunatamente bitset e bitget non sono in grado di gestire vettori di sequenze di bit. Dato che ho un set di dati abbastanza grande, sono interessato a soluzioni efficienti.

Qualsiasi aiuto sarebbe apprezzato, grazie!

+1

Si può fornire i dati esempio di input e output nel formato esatto (si può fare un piccolo vettore di dire solo 3 campioni) – Dan

risposta

3

dec2bin e bin2dec in grado di elaborare i vettori, è possibile inserire tutti i numeri in una sola volta e permutare la matrice:

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

se disponibile, vorrei utilizzare de2bi e bi2de invece.

+2

Nota che l'ordine bit con 'de2bi' è il contrario di quello con' dec2bin' –

1

Non so se posso ottenere la domanda sbagliata, ma non è solo risolvibile con l'indicizzazione avvolta in 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) 

O qual è il formato di input e output desiderato?


BIN = 

    '01010100' '00101010' 


output = 

    '00100110' '00011001' 
0

Il modo più efficace è probabilmente quello di utilizzare bitget e bitset come hai fatto nella tua domanda, anche se hai solo bisogno di un numero intero a 8 bit. Supponiamo di avere un uint8 serie X che descrive i dati registrati (per l'esempio di seguito, X = uint8([169;5]), per nessun motivo particolare possiamo controllare i bit creando una utile funzione anonima:.

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

e si supponga di avere un certo modello pattern in base al quale si desidera riordinare i bit memorizzati in questo vettore di interi:

>> pattern 

pattern = 

    1  8  2  7  3  6  4  5 

È possibile utilizzare arrayfun e find per riordinare i bit in base alle pattern:

Y = arrayfun(@(X) uint8(sum(bitset(uint8(0),find(bitget(X,pattern))))), X) 

Y = 

    99 
    17 

si ottiene la risposta desiderata memorizzata in modo efficiente in un vettore di 8 interi bit:

>> class(Y) 

ans = 

uint8 

>> dispbits(Y) 
    1 1 0 0 0 1 1 0 

    1 0 0 0 1 0 0 0