popcnt?
логично
Ну первый вариант дефолтный, очень много задач с битами решаются через таблицу (те же генерации масок для симд), второй вариант наивный, на асме можно было бы без джампов сделать через сдвиги и керри флаг. Но попкаунт в любом случае выигрывает (там, где есть sse4.2, естественно). Других вариантов вроде не видел.
У меня под арм микроконтроллеры таблица для 4 битных чисел и сдвиг в цикле. size_t popcount_32(uint32_t data) { static const uint8_t counts[16] = { [0] = 0, [1] = 1, // ... [15] = 4, }; size_t res = 0; while (data) { res += counts[data & 0x0F]; data >>= 4; } return res; }
Обсуждают сегодня