比特反转

uint32_t reverseBits(uint32_t n) {
    // 分治,所有小组内交换前半段和后半段
    // 比如n是uint8_t,初始len=8,mask=11111111
    // 所有组内对半分并交换:
    // 1. 算出对应所有组内后半段的mask:len >>= 1; mask ^= (mask << len);
    // 2. 将所有组内前半段后移并用mask取出、后半段前移并用~mask取出
    //  第1轮:mask=00001111,~mask=11110000
    //  第2轮:mask=00110011,~mask=11001100
    //  第3轮:mask=01010101,~mask=10101010
    int len = sizeof(n) * 8;
    uint32_t mask = ~0;
    while (len > 1) {
        len >>= 1;
        mask ^= (mask << len); // 算mask是关键
        n = ((n >> len) & mask) | ((n << len) & ~mask);
    }
    return n;
}