2011-01-20 29 views
5

No entiendo por qué esto me da la misma respuesta:desplazamientos de bit en C++

long long a = 3265917058 >> 24; 
std::cout << a << std::endl; //194 

long long ip = 3265917058; 
long long b = ip >> 24; 
std::cout << b << std::endl; //194 

pero esto no:

long long a = (3265917058 << 16) >> 24; 
std::cout << a << std::endl; //240 

long long ip = 3265917058; 
long long b = (ip << 16) >> 24; 
std::cout << b << std::endl; //12757488 - **i want this to be 240 too!** 

Actualización: Quiero desplazamiento de 32 bits, pero ¿cómo puede ¿Cambio 32bit un número que es demasiado grande para una variable int? Update2: Mi respuesta es hacer unsigned int ip. Entonces todo estará bien.

Respuesta

7

Su constante literal 3265917058 es un int. Añadir un sufijo LL para obtener el behavio (u) r esperado:

long long a = (3265917058LL << 16) >> 24; 
+0

pero ¿cómo obtengo la respuesta 240 si utilizo la variable? No puedo almacenar 3265917058 en un int. – Stals

+0

@Stals: su constante todavía se ajusta en 32 bits; solo se trata módulo 2^32 - la representación de bit es la misma. Un compilador decente debería advertirte sobre esto, ¿tienes advertencias habilitadas? –

+0

activado, pero sin advertencias. – Stals

2

3265917058<<16 ambos lados son int, por lo que la operación se llevará a cabo en int (32-bits).

Necesita 3265917058LL<<16, entonces el lado izquierdo será long long y la operación se realizará con ese ancho, es decir, 64 bits.

1

para conseguir lo que pide:

long long ip=3265917058; 
long long b= (static_cast<unsigned int>(ip)<<16)>> 24; 
std::cout<<b<<std::endl; // 240 

Tenga en cuenta que el resultado que se obtendrá (240) no es portátil. Matemáticamente, el resultado debería ser 12757488. El valor 240 se debe al truncamiento, y no se garantiza que esto suceda. Por ejemplo, no ocurre en sistemas donde int es de 64 bits.