Java делает это таким образом (используя 32-разрядные целые числа) (14 вычислений)
public static int bitCount(int i) {
// HD, Figure 5-2
i = i - ((i >>> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
i = (i + (i >>> 4)) & 0x0f0f0f0f;
i = i + (i >>> 8);
i = i + (i >>> 16);
return i & 0x3f;
}
Для 16-разрядных целых чисел (коротких) метод можно переписать так:
private static int bitCount(int i) {
// HD, Figure 5-2
i = i - ((i >>> 1) & 0x5555);
i = (i & 0x3333) + ((i >>> 2) & 0x3333);
i = (i + (i >>> 4)) & 0x0f0f;
i = i + (i >>> 4);
i = i + (i >>> 8);
return i & 0x3f;
}
Для 8-битных целых чисел (в байтах) это немного сложнее, но общая идея есть.
Вы можете проверить эту ссылку для получения дополнительной информации о функциях быстрого счета битов: http://gurmeetsingh.wordpress.com/2008/08/05/fast-bit-counting-routines/
Самый быстрый / простой способ для любого целого числа: O (0) для лучшего случая и O (n) для худшего (где n - количество битов в значении) -
static private int bitcount(int n) {
int count = 0 ;
while (n != 0) {
count++ ;
n &= (n - 1) ;
}
return count ;
}