He leído this SO question acerca de 32 bits, pero ¿qué pasa con los números de 64 bits? ¿Debo enmascarar los 4 bytes superiores e inferiores, realizar el conteo de los 32 bits y luego sumarlos?¿Contar el número de bits en un entero de 64 bits (largo, grande)?
Respuesta
Puede encontrar la versión de 64 bits aquí http://en.wikipedia.org/wiki/Hamming_weight
Es algo como esto
static long NumberOfSetBits(long i)
{
i = i - ((i >> 1) & 0x5555555555555555);
i = (i & 0x3333333333333333) + ((i >> 2) & 0x3333333333333333);
return (((i + (i >> 4)) & 0xF0F0F0F0F0F0F0F) * 0x101010101010101) >> 56;
}
Ésta es una versión de 64 bits de la clave aquí How to count the number of set bits in a 32-bit integer?
El uso de la sugerencia de Joshua me transformaría en esto:
static int NumberOfSetBits(ulong i)
{
i = i - ((i >> 1) & 0x5555555555555555UL);
i = (i & 0x3333333333333333UL) + ((i >> 2) & 0x3333333333333333UL);
return (int)(unchecked(((i + (i >> 4)) & 0xF0F0F0F0F0F0F0FUL) * 0x101010101010101UL) >> 56);
}
EDIT: Encontré un error al probar la versión de 32 bits. Agregué paréntesis faltantes. La suma debe hacerse antes de bit a bit &, en la última línea
Edit2 Añadida versión más seguro para ULONG
Un rápido (y más portátil que el uso de extensiones del compilador no estándar) forma:
int bitcout(long long n)
{
int ret=0;
while (n!=0)
{
n&=(n-1);
ret++;
}
return ret;
}
Cada vez que haces un n&=(n-1)
se elimina el último conjunto de bits en n
. Por lo tanto, esto toma el tiempo O (número de bits establecidos).
Esto es más rápido que el O (log n) que necesitaría si probara cada bit - no todos los bits están configurados a menos que el número sea 0xFFFFFFFFFFFFFFFF
), por lo tanto, generalmente necesita muchas iteraciones.
respuesta estándar en C#:
ulong val = //whatever
byte count = 0;
while (val != 0) {
if ((val & 0x1) == 0x1) count++;
val >>= 1;
}
Esto desplaza val
derecha un bit, y los incrementos count
si se establece el bit más a la derecha. Este es un algoritmo general que se puede usar para cualquier entero de longitud.
- 1. Contar el número de bits puestos en un entero
- 2. generar aleatoria de 64 bits número entero
- 3. IEEE-754 Doble (coma flotante de 64 bits) vs. Largo (Entero de 64 bits) Revisited
- 4. C++: ¿Es seguro comparar un número entero de 64 bits con un número entero de 32 bits?
- 5. cómo tener un entero de 64 bits en PHP?
- 6. 64 bits por división de 32 bits
- 7. Representando un entero de 64 bits en GNU/Linux
- 8. Cómo imprimir un entero de 64 bits en GCC 4.4.1?
- 9. ¿Aplicación de 32 bits o de 64 bits en el sistema operativo de 64 bits?
- 10. errores D Automatica (Número 64 bits?)
- 11. ¿Qué tan grande puede ser un entero de 64 bits con signo?
- 12. Looping a través de bits en un número entero, ruby
- 13. Aplicaciones Java de 64 bits: ¿Se requiere un SO de 64 bits, un JRE de 64 bits y una Aplicación de 64 bits?
- 14. Identificación única de URL con un número de 64 bits
- 15. Manera pitónica de iterar sobre los bits del número entero
- 16. Modificar bits en un entero en Python
- 17. Entero a byte con un número dado de bits establecidos
- 18. Determinación de Windows de 64 bits frente a 32 bits
- 19. ¿Ventajas/inconvenientes de ejecutar JVM de 64 bits en un servidor Linux de 64 bits?
- 20. Registros de 64 bits en ventanas de 32 bits
- 21. ¿Cómo compilar un programa C++ como de 64 bits en una máquina de 64 bits?
- 22. NCover en el sistema de 64 bits
- 23. Ejecute AnyCPU como 32 bits en sistemas de 64 bits
- 24. ¿Cómo cuento el número de bits cero en un número entero?
- 25. Inversión de bits del número entero de Python
- 26. 64 bits ODBC Excepción
- 27. ¿Cómo simulo una rotación a nivel de bits de un entero de 64 bits (sin signo) en JavaScript?
- 28. Utilice un instalador de NSIS para instalar binarios de 32 bits en sistemas operativos de 32 bits y binarios de 64 bits en sistemas operativos de 64 bits.
- 29. Escrituras atómicas de 64 bits con GCC
- 30. Pregunta Quicktime de 64 bits
debe ser largo sin signo para evitar ser quemado – Joshua
operaciones deben ser sin marcar. De lo contrario, la multiplicación en la última línea se desborda muy fácilmente. Pero si no se controlan, creo que funciona para la firma también. Incluso si el cambio es aritmético, la mayoría de los bits significativos se descartan en un bit y la sustracción en la primera línea puede desbordarse en silencio hasta el resultado correcto. –