Programming2013. 6. 7. 13:59


방법 1.

int count_bits( unsigned int data )
{
	int cnt = 0;

	while( data != 0 ) {
		data = data & (data − 1);
		cnt++;
	}

	return cnt;
}


방법 2.

방법1로 테이블을 만들어 사용.

static unsigned char byte_bit_count[256];	/∗ lookup table ∗/

void initialize_count_bits()
{
	int cnt, i, data;

	for ( i = 0; i < 256; i ++ ) {
		cnt = 0;
		data = i ;

		while( data != 0 ) {	/∗ method one ∗/
			data = data & (data − 1);
			cnt++;
		}

		byte_bit_count[i] = cnt;
	}
}

int count bits ( unsigned int data )
{
	const unsigned char∗ byte = (unsigned char ∗) & data;

	return byte_bit_count[byte[0]] + byte_bit_count[byte[1]] +
			byte_bit_count[byte[2]] + byte_bit_count[byte[3]];
}


방법3.

int count_bits(unsigned int x)
{
	static unsigned int mask[] = {	0x55555555,
									0x33333333,
									0x0F0F0F0F,
									0x00FF00FF,
									0x0000FFFF };
	int i;
	int shift;	/∗ number of positions to shift to right ∗/


	for (i =0, shift =1; i < 5; i ++, shift ∗= 2)
		x = (x & mask[i]) + ((x >> shift) & mask[i]);

	return x;
}


PC Assembly Language에서 인용. http://www.drpaulcarter.com/

'Programming' 카테고리의 다른 글

automake 과정  (0) 2013.06.21
Posted by 쿨한넘