#include <stdio.h> #include <stdint.h> uint32_t popcnt(uint32_t x) { uint32_t x_ = x; x_ = (x_ & 0x55555555) + (x_>>1 & 0x55555555); x_ = (x_ & 0x33333333) + (x_>>2 & 0x33333333); x_ = (x_ & 0x0f0f0f0f) + (x_>>4 & 0x0f0f0f0f); x_ = (x_ & 0x00ff00ff) + (x_>>8 & 0x00ff00ff); x_ = (x_ & 0x0000ffff) + (x_>>16 & 0x0000ffff); return x_; } #popcntがやらんとしていること popcntの意図を説明した図を作ってみました。 この図では例として、8ビット長のビット並び