template< class T >
auto count_bits( T val )
{
using R = make_unsigned_t< T >;
const R mask_x55 = ~R( 0 ) / 0x03;
const R mask_x33 = ~R( 0 ) / 0x0F * 0x03;
const R mask_x0F = ~R( 0 ) / 0xFF * 0x0F;
const R mask_x01 = ~R( 0 ) / 0xFF;
const R to_MSB = ( sizeof( R ) - 1 ) * CHAR_BIT;
R v = R( val );
v = v - ( ( v >> 1 ) & mask_x55 );
v = ( v & mask_x33 ) + ( ( v >> 2 ) & mask_x33 );
v = v + ( v >> 4 ) & mask_x0F;
return v * mask_x01 >> to_MSB;
}
첫댓글 이게 머얌 무서어