2011-12-30 16 views
5

¿Por qué es el primero capaz de incrementar pbf_ [k] correctamente mientras que el segundo ni siquiera lo hace (incrementar) por una vez?¿Cuál es la diferencia entre estos dos bloques de código de C++?

unsigned pbf_[5] ={0}; 
bool m=0; 

Código 1:

for(int k=0;k<5;k++)  
{ 

    if((m=(bit_table_[k][i][bit_index ] &bit_mask[bit]))==true)  
    pbf_[k]++; 
    } 

Código 2:

for(int k=0;k<5;k++)  
{ 
    if((bit_table_[k][i][bit_index ] & bit_mask[bit])==true) 
     pbf_[k]++; 
} 
+0

Bueno, deberías verificar el valor de M dentro de cada iteración, así como también después de ellos, y deberías ver la diferencia ... –

Respuesta

7

En el primer caso, el resultado del enmascaramiento se convierte en bool m antes de que se compare con verdadero.

En el segundo caso, creo que las máscaras de bits son de tipo entero. En ese caso, true se promocionará al mismo tipo de entero (y tendrá el valor 1).

Simplemente elimine el == true de la comparación para que sean equivalentes.

+3

En caso de que @John no se dé cuenta, '&' es a nivel de bit AND, no lógico Y, por lo que el resultado es un número entero. Un entero distinto de cero evaluado en un contexto booleano es verdadero, pero no es * igual al valor de 'true' como un entero * que es 1. –

+0

Otra forma de solucionar esto sería usar un molde explícito para' bool'. Sin embargo, esto es una tontería, ya que compararlo con "verdadero" es tonto en primer lugar. De la misma manera que la frase "es verdad que" casi siempre es superflua en inglés, '== true' casi siempre es superfluo en la programación. –

0

el primero en las pruebas el resultado de la la asignación a m del valor de bit_table_[k][i][bit_index ] & bit_mask[bit], mientras que el segundo simplemente pone a prueba si

bit_table_[k][i][bit_index ] & bit_mask[bit] resultados no 0

Ambos tienen el mismo efecto, excepto que el primero registra el resultado en m en cada iteración.

+1

No, no tienen el mismo efecto, y tu descripción de la segunda prueba es, creo, incorrecta. Ver la respuesta de Bo Persson. – Mat

0

En primer lugar, comprueba

if((m=(bit_table_[k][i][bit_index ] &bit_mask[bit]))==true) 

se assining algún valor para m variable y que se toma por si como verdadero.

0

Encontré un problema en tu código. Debe utilizar & & en lugar de &. En comparación, & & es un operador lógico y difiere de & - operador de bits.

Ejemplo:

if ((m = (bit_table_ [k] [i] [bit_index] & & bit_mask [bit])) == true)

para aprender acerca de operador en C++ que pueda visita: http: //www.worldbestlearningcenter.com/index_files/c++_operators.htm

+0

No, él quiere un operador bit a bit porque necesita verificar que un bit específico esté configurado en ambos valores. Sin embargo, él tiene que ** ** no comparar el resultado con 'verdadero', porque eso es equivalente a compararlo con '1', cuando puede ser algún otro valor distinto de cero incluso en una" coincidencia ". @BoPersson tiene razón. –

Cuestiones relacionadas