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 12como se esperaba.
c++
bit-manipulation
Ron Howard
fuente
fuente

<<tiene menor prioridad que+,1<<2 + 1<<3=1<<(2 + 1)<<31<<2 + 1<<3es 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) << 3Ademá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<<3lo tanto, se realiza de1 << (2 + 1) << 3forma 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