ビットリバース
ビットを数える・探すアルゴリズムのpopcountをちょっと改変すればいいだけやんけ。
#include <stdio.h> unsigned int bitreverse(unsigned int x) { x = (x & 0x55555555)<<1 | (x & 0xaaaaaaaa)>>1; x = (x & 0x33333333)<<2 | (x & 0xcccccccc)>>2; x = (x & 0x0f0f0f0f)<<4 | (x & 0xf0f0f0f0)>>4; x = (x & 0x00ff00ff)<<8 | (x & 0xff00ff00)>>8; x = (x & 0x0000ffff)<<16 | (x & 0xffff0000)>>16; return x; } #define bitreverse_range(x,s) (bitreverse((x))>>(32-(s))) int main() { int i; for(i = 0; i < 128; ++i) { printf("%d -> %d\n", i, bitreverse_range(i, 7)); } return 0; }