2012-08-19 5 views

risposta

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

aggiunge Chiaramente data[c] a sum se e solo se data[c] è maggiore o uguale a 128. E 'facile dimostrare che

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

è equivalente (ove data vale solo valori positivi, che lo fa) :

data[c] - 128 è positivo se e solo se data[c] è maggiore o uguale a 128. Spostato aritmeticamente a destra di 31, diventa o tutti (se era sma ller di 128) o tutti zeri (se era maggiore o uguale a 128).

La seconda riga aggiunge poi sum sia 0 & data[c] (così zero) nel caso in cui data[c] < 128 o 0xFFFFFFFF & data[c] (così data[c]) nel caso in cui data[c] >= 128.

3

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

(Si noti che questo hack non è strettamente equivalente a quello originario se-dichiarazione. Ma in questo caso, è valido per tutti i valori di input di dati [].)

(data[c] - 128) >> 31; // questo sta tentando di estrarre solo il bit di segno di dati [c] quando i dati [c] sono maggiori o uguali a 128, se è inferiore a 128 quindi (dati [c] - 128) verranno automaticamente spostare in un numero negativo impostando così il bit del segno.

e sum += ~t & data[c]; volontà E i dati di valore [c] con 1 o 0 a seconda del valore integrato di bit.Signifies segno nulla sarà aggiunto sum se il valore ((data[c] - 128)) è negativo.

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

è uguale

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

che significa che aggiungono data[c] riassumere se data[c] - 128 non è negativo. Quindi dobbiamo estrarre il segno di data[c] - 128. Poiché i dati sono array int per 32 bit. Quindi, per ottenere il segno, dobbiamo modificarlo aritmeticamente con 32 - 1 = 31 volte. So

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 = (dati [c] - 128) >> 31; Qui i dati [c] sono di tipo int e tipo di dati int size 4 bytes.if (data [c] - 128) è positivo e 31th bit è bit di segno e il suo valore sarà 0.if (dati [c] - 128) è negativo, quindi il 31 ° bit sarà 1.quando lo spostamento a destra, 31 ore, fornirà solo il bit del segno. Ci scusiamo per il cattivo inglese

Problemi correlati