2015-08-03 14 views
5

Mam zapisane dane zawierające wektor sekwencji bitowych, które chciałbym ponownie zorganizować wydajnie. Jedna wartość w wektorze danych może wyglądać następująco:Efektywne tasowanie bitów wektora liczb binarnych

bit0, bit1, bit2, ... bit7 

chciałbym ponownie zorganizować ten bit-sekwencja w tej kolejności:

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

Gdybym miał tylko jedną wartość ta będzie działać ładnie przez:

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

Niestety bitset i bitget nie są w stanie obsługiwać wektorów sekwencji bitowych. Ponieważ mam dość duży zbiór danych, interesują mnie skuteczne rozwiązania.

Każda pomoc będzie doceniona, dzięki!

+1

można podać przykładowe dane wejściowe i wyjściowe w dokładny format (można zrobić to mały wektor słownie tylko 3 próbki) – Dan

Odpowiedz

3

dec2bin i bin2dec może przetwarzać wektory można wejście do wszystkich numerów na raz i permutacji matrycy:

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

jeśli są dostępne, chciałbym użyć de2bi i bi2de zamiast.

+2

Należy zauważyć, że kolejność bitów z 'de2bi' jest odwrotnością tego z' dec2bin' –

1

Nie wiem, czy mogę postawić pytanie źle, ale czy to nie jest możliwe do rozwiązania przez indeksowanie opakowane w 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) 

A jaki jest format wejściowy i pożądany wynik?


BIN = 

    '01010100' '00101010' 


output = 

    '00100110' '00011001' 
0

Najbardziej efektywnym sposobem jest użycie bitget i bitset, tak jak w pytaniu, chociaż potrzebujesz tylko 8-bitowej liczby całkowitej. Załóżmy, że masz uint8 tablicę X który opisuje nagrane dane (na poniższym przykładzie X = uint8([169;5]), bez żadnego konkretnego powodu Możemy sprawdzić bity tworząc użyteczną funkcję anonimową.

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

i załóżmy, że masz jakiś wzór pattern według którego chcesz zmienić kolejność bitów zapisanych w tym wektorze liczb całkowitych:

>> pattern 

pattern = 

    1  8  2  7  3  6  4  5 

można wykorzystać arrayfun i find aby zmienić kolejność bitów według pattern:

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

Y = 

    99 
    17 

Dostajemy pożądaną odpowiedź przechowywane skutecznie w wektorze 8 bitowych liczb całkowitych:

>> class(Y) 

ans = 

uint8 

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

    1 0 0 0 1 0 0 0 
Powiązane problemy