2012-08-19 9 views

Odpowiedz

26
if (data[c] >= 128) 
    sum += data[c]; 

Wyraźnie dodaje data[c] do sum wtedy i tylko wtedy, gdy data[c] jest większa lub równa 128. Łatwo pokazać, że

int t = (data[c] - 128) >> 31; 
sum += ~t & data[c]; 

jest równoważna (gdy data posiada tylko wartości dodatnie, co robi) :

data[c] - 128 jest dodatnia wtedy i tylko wtedy, gdy data[c] jest większa lub równa 128. Przesunięta arytmetycznie w prawo o 31, staje się albo wszystkimi (jeśli była to sma ller niż 128) lub wszystkie zera (jeśli było większe lub równe 128).

Druga linia następnie dodaje sum albo 0 & data[c] (czyli zero), w przypadku, data[c] < 128 lub 0xFFFFFFFF & data[c] (tak data[c]) w przypadku, gdy data[c] >= 128.

3

int t = (data[c] - 128) >> 31; sum += ~t & data[c];

(Zauważ, że ten siekać nie jest ściśle odpowiadające oryginalnej if-deklaracji. Ale w tym przypadku, to jest ważne dla wszystkich wartości wejściowych danych []).

(data[c] - 128) >> 31; // to próbuje wyodrębnić tylko bit znaku bitowego danych [c], gdy dane [c] są większe niż lub równe 128, jeżeli jest mniejsze niż 128 to (dane [c] - 128) zostaną automatycznie przesunięcie do pewnej liczby ujemnej, ustawiając w ten sposób bit znaku.

i sum += ~t & data[c]; woli i dane wartości [c] z 1 lub 0, w zależności od wartości bit.Signifies uzupełnione znak nie będą dodawane do sum jeśli wartość ((data[c] - 128)) jest ujemna.

0
if (data[c] >= 128) 
    sum += data[c]; 

jest równa

if (data[c] - 128 >= 0) 
    sum += data[c]; 

co oznacza, że ​​dodatek data[c] Podsumowując jeśli data[c] - 128 nie jest negatywna. Musimy więc wyodrębnić znak data[c] - 128. Ponieważ dane to tablica 32-bitowa. Aby uzyskać znak, musimy arytmetycznie przesunąć go raz na jakiś czas. Więc

int t = (data[c] - 128) >> 31; //where t is the sign of data[c] - 128, 0 for positive and 1 for negative 
sum += ~t & data[c]; //Add data[c] in sum if t = 0 i.e when the sign of data[c] - 128 is positive 
-1

int t = (dane [c] - 128) >> 31; Tutaj dane [c] są typem danych int i rozmiarem danych int rozmiar 4 bajty.if (dane [c] - 128) są dodatnie, a 31 bit jest bitem znaku, a jego wartością będzie 0.if (dane [c] - 128) jest ujemny, wtedy 31. bit będzie 1. potem prawe przesunięcie 31 razy da ci tylko bit znaku. Przepraszamy za biedny angielski

Powiązane problemy