stackprobe7s_memo

何処にも披露する見込みの無いものを書き落とす場所

ビット操作

一番下の立ち上がっているビットを得る

uint LowestBit(uint value)
{
	return value & ~value + 1;
}

// - - -
動作確認用

uint LowestBit_TEST(uint value)
{
	int bit;

	for(bit = 0; bit < 32; bit++)
		if(value & 1u << bit)
			return 1u << bit;

	return 0u;
}

立ち上がっているビットを数える

int GetBitCount(uint value)
{
	value = ((value & 0xaaaaaaaa) >>  1) + (value & 0x55555555);
	value = ((value & 0xcccccccc) >>  2) + (value & 0x33333333);
	value = ((value & 0xf0f0f0f0) >>  4) + (value & 0x0f0f0f0f);
	value = ((value & 0xff00ff00) >>  8) + (value & 0x00ff00ff);
	value = ((value & 0xffff0000) >> 16) + (value & 0x0000ffff);

	return value;
}

0002

int GetBitCount2(uint value)
{
	int count = 0;

	while(value)
	{
		value ^= LowestBit(value);
		count++;
	}
	return count;
}

// - - -
動作確認用

int GetBitCount_TEST(uint value)
{
	int count = 0;
	int bit;

	for(bit = 0; bit < 32; bit++)
		if(value & 1u << bit)
			count++;

	return count;
}

ビット列の並びを反転する

uint ReverseBits(uint value)
{
	value = (value <<  1 & 0xaaaaaaaa) | (value >>  1 & 0x55555555);
	value = (value <<  2 & 0xcccccccc) | (value >>  2 & 0x33333333);
	value = (value <<  4 & 0xf0f0f0f0) | (value >>  4 & 0x0f0f0f0f);
	value = (value <<  8 & 0xff00ff00) | (value >>  8 & 0x00ff00ff);
	value = (value << 16 & 0xffff0000) | (value >> 16 & 0x0000ffff);

	return value;
}

// - - -
動作確認用

uint ReverseBits_TEST(uint value)
{
	uint ret = 0;
	int bit;

	for(bit = 0; bit < 32; bit++)
		if(value & 1u << bit)
			ret |= 1u << 31 - bit;

	return ret;
}