representarse representar pueden podemos para operadores numeros numero necesitan hasta estados desplazamiento derecha cuantos corrimiento contar con c++ c

c++ - representar - ¿Cómo puedo cambiar un bit a largo por más de 32 bits?



desplazamiento de bits en c (7)

¿Está seguro de que un largo es de 64 bits con su sistema operativo y compilador en particular? Usa stdint.h y pruébalo así:

#include <stdint.h> uint64_t x = (1ULL << 37);

Esta pregunta ya tiene una respuesta aquí:

Parece que debería poder realizar el cambio de bits en C / C ++ en más de 32 bits siempre que el operando izquierdo del cambio sea largo. Pero esto no parece funcionar, al menos con el compilador g ++.

Ejemplo:

unsigned long A = (1L << 37)

da

A = 0

que no es lo que quiero ¿Me estoy perdiendo algo o esto simplemente no es posible?

-J


A es igual a 0 porque A solo tiene 32 bits, por lo que, por supuesto, está desplazando todos los bits a la izquierda, dejando solo 0 bits. Necesitas hacer un A 64-bit:

unsigned long long A = (1ULL << 37);

O si pretende usar Visual C ++:

unsigned __int64 A = (1ULL << 37);


Bueno, depende del tamaño real del tipo long (más precisamente, su ancho en bits). Lo más probable es que en su plataforma, el long tenga un ancho de 32 bits, por lo que obtendrá 0 como resultado (también, vea PS a continuación). Utilice un tipo más grande. long long tal vez?

PS Como nota adicional, cambiar un tipo en más bits que su ancho (o igual número de bits) produce un comportamiento indefinido en C y C ++ (C ++ usa el término longitud en lugar de ancho ). Por lo tanto, no se garantiza que obtenga 0 de 1L << 37 ni de 1L << 32 en una plataforma donde el long tiene un ancho de 32.


El nuevo estándar de C ++ introduce sufijos LL y ULL para literales enteros. Puedes intentar usarlos ya que todos los compiladores más recientes los admiten. Pero debe saber que no es parte del estándar C ++ actual.

long long A = (1LL << 37)


En su caso, usted está restringido a los tipos de base de idioma. Una solución genérica para enteros de tamaño arbitrario [cuasi] es usar la clase Integer en Crypto ++ .


Usted tiene los argumentos invertidos.

unsigned long A1 = (1L << 37); // is 2 to the 37th unsigned long A = (37UL<<1UL); // has just multiplied 37 by 2


Vuelva a intentarlo utilizando una variable de tipo uint64_t (de stdint.h ) en lugar de long . Se garantiza que uint64_t tiene una longitud de 64 bits y debe comportarse como usted espera.