ビット操作
一番下の立ち上がっているビットを得る
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; }