2012-08-19 22 views

Respuesta

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

claramente añade data[c] a sum si y sólo si data[c] es mayor o igual que 128. Es fácil demostrar que

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

es equivalente (cuando data solamente contiene valores positivos, lo que lo hace) :

data[c] - 128 es positivo si y solo si data[c] es mayor o igual que 128. Se desplaza aritméticamente a la derecha por 31, se convierte en cualquiera de los dos (si fue sma más de 128) o todos los ceros (si fue mayor o igual a 128).

La segunda línea a continuación, se suma a sum ya sea 0 & data[c] (de modo cero) en el caso de que data[c] < 128 o 0xFFFFFFFF & data[c] (así data[c]) en el caso de que data[c] >= 128.

3

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

(Tenga en cuenta que este truco no es estrictamente equivalente a la original sentencia if. Pero en este caso, es válido para todos los valores de entrada de de datos [].)

(data[c] - 128) >> 31; // esto está tratando de extraer solo el bit de signo de datos [c] cuando los datos [c] son ​​mayores o iguales a 128, si es menor que 128 entonces (datos [c] - 128) automáticamente cambia a un número negativo, configurando así el bit de signo.

y sum += ~t & data[c]; voluntad y los datos de valor [c] con 1 ó 0 dependiendo del valor complementada de bit.Signifies muestra nada será añadido a sum si el valor ((data[c] - 128)) es negativo.

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

es igual a

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

lo que significa que se suman a resumir data[c]data[c] - 128 si no es negativo. Entonces necesitamos extraer el signo de data[c] - 128. Como los datos son 32bit int array. Entonces, para obtener el signo, necesitamos desplazarlo aritméticamente 32 - 1 = 31 veces. Entonces

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 = (datos [c] - 128) >> 31; Aquí los datos [c] son ​​tipo de datos int y tipo de datos int tamaño 4 bytes.if (datos [c] - 128) es positivo y 31 es el bit de signo y su valor será 0.if (datos [c] - 128) es negativo, entonces el bit 31 será 1. luego el desplazamiento a la derecha 31times le dará solo el bit de signo. Lo siento por un inglés pobre

Cuestiones relacionadas