El siguiente código muestra 0,1,32,33. Lo cual es contra intuitivo por decir lo menos. Pero si reemplazo el literal 1 con el tipo constante anual "ONE", el ciclo funciona bien.¿Error del compilador del cambio de bit o una caja de esquina?
Esto es con gcc 4.6.2 y -std = C++ 0x.
#include<iostream>
#include<cstdint>
using namespace std;
int main()
{
int64_t bitmask = 3;
int64_t k;
const int64_t ONE = 1;
cout<<"bitmask = "<<bitmask<<endl;
for(k=0; k<64; k++)
{
if(bitmask & (1<<k))
{
cout<<"k="<<k<<endl;
}
}
return 0;
}
EDITAR Pregunta: Como Ben señaló, 1 se ve que es de 32 bits de ancho por defecto. ¿Por qué no se promueve a 64 bits cuando su co-operando es de 64 bits?
SOLUCIÓN
Nº < < no requiere que cada lado tiene el mismo tipo. Después de todo, ¿por qué convertir el lado derecho en int64_t cuando el desplazamiento máximo disponible cabe en un char? La promoción solo ocurre cuando se trata de operadores aritméticos, no de todos los operadores.
Copiado de los comentarios de Bill a continuación
posible duplicado de [¿Cómo cambio un bit de largo en más de 32 bits?] (Http://stackoverflow.com/questions/2404439/how-do-i-bit-shift-a-long-by- más de 32 bits) –