適当書いたビットリバース

ビットリバース。

#include<stdio.h>
typedef unsigned int uint;

void printbits(uint n, int bitlen)
{    
    int i;    
    for (i = 0; i < bitlen; i++)       
        printf("%d", (n >> (bitlen-i-1)) & 1);
}

uint bitreverse(uint n, int bitlen)
{
    uint r = 0;
    int i;
    for (i = 0; i < bitlen; i++, n>>=1)
        r = r << 1 | n & 1;
    return r;
}

int main(int argc, char** argv)
{
    uint n = atoi(argv[1]);
    int bitlen = atoi(argv[2]);
    //printbits(n, bitlen); printf("\n");
    n = bitreverse(n, bitlen);
    printbits(n, bitlen); printf(" %d", n); printf("\n");
}

実行

$ for i in $(seq 0 15); do ./a.out $i 4; done
0000 0
1000 8
0100 4
1100 12
0010 2
1010 10
0110 6
1110 14
0001 1
1001 9
0101 5
1101 13
0011 3
1011 11
0111 7
1111 15