¿Cuenta el número de bits en un entero de 64 bits (largo, grande)?

He leído esta pregunta sobre SO 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 sumrlos?

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; } 

Esta es una versión de 64 bits del formulario de código aquí. ¿Cómo contar el número de bits configurados en un entero de 32 bits?

Usando la sugerencia de Joshua, lo 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 sum debe hacerse antes de bit a bit y, en la última línea

EDIT2 Versión segura añadida para ulong

Una forma rápida (y más portátil que usar extensiones de comstackdor no estándar):

 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) , eliminas el último bit configurado 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 a val derecho 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.