Así que solo estaba tratando de manipular un poco en C ++. Esto es lo que probé:
int a = 1<<2;
cout<<a;
Esto da la salida como 4
.
int a = 1<<3;
cout<<a;
Esto da la salida como 8
Pero cuando lo hago:
int a = 1<<2 + 1<<3;
cout<<a;
Da la salida como 64
. ¿Porque?
También probé:
int a = 1<<2;
int b = 1<<3;
cout<<a + b;
Lo que da la salida 12
como se esperaba.
c++
bit-manipulation
Ron Howard
fuente
fuente
<<
tiene menor prioridad que+
,1<<2 + 1<<3
=1<<(2 + 1)<<3
1<<2 + 1<<3
es realmente1<< 2+1 <<3
. No se deje engañar por los espacios en blanco.Respuestas:
Esto se debe a que la suma tiene una mayor prioridad de operador que el desplazamiento de bits. En otras palabras, su segundo ejemplo es equivalente a
1 << (2 + 1) << 3
Además, dado que el desplazamiento de bits es asociativo a la izquierda, es lo mismo que
(1 << (2 + 1)) << 3
. Esto se simplifica a8 << 3
, que es64
.fuente
Se trata de la precedencia del operador
+
tiene mayor precedencia que los operadores de turno, por1<<2 + 1<<3
lo tanto, se realiza de1 << (2 + 1) << 3
forma similar a1 << 6 == 64
(dado que<<
es asociativo a la izquierda , como puede ver en la tabla de precedencia en el enlace de arriba)Por eso también
cout<<a + b;
funciona, porque se analiza comocout<<(a + b);
, de lo contrario, obtendrá algunos errores como "no se puede agregar un número a una transmisión"fuente
El
+
operador tiene una precedencia más alta que el<<
operador, así que aquí se está evaluando esa línea:Debe agruparlo así entre paréntesis:
fuente