C++ 翻转一字节的位序

发现了两种算法,一种查表,另一种是多次移位和交换。计算结果完全相同,不知道哪种效率更高,应该差不多。

移位交换

    constexpr uint8_t reverse_byte(uint8_t b) {
        b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
        b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
        b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
        return b;
    }

这个算法来自:Stack Overflow

查表

可以用256 字节的大表只查一次解决,也可以用16 字节的小表,依次翻转高4 位和低4 位,我用了小表。

    constexpr uint8_t reverse_half_byte(uint8_t half) {
        constexpr uint8_t TABLE[] = {
            0b0000,  // 0  : 0b0000
            0b1000,  // 1  : 0b0001
            0b0100,  // 2  : 0b0010
            0b1100,  // 3  : 0b0011
            0b0010,  // 4  : 0b0100
            0b1010,  // 5  : 0b0101
            0b0110,  // 6  : 0b0110
            0b1110,  // 7  : 0b0111
            0b0001,  // 8  : 0b1000
            0b1001,  // 9  : 0b1001
            0b0101,  // 10 : 0b1010
            0b1101,  // 11 : 0b1011
            0b0011,  // 12 : 0b1100
            0b1011,  // 13 : 0b1101
            0b0111,  // 14 : 0b1110
            0b1111,  // 15 : 0b1111
        };

        return TABLE[half];
    }

    constexpr uint8_t reverse_byte_by_table(uint8_t b) {
        uint8_t h = b >> 4;
        uint8_t l = b & 0xf;
        h = reverse_half_byte(h);
        l = reverse_half_byte(l);
        return (l << 4) | h;
    }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值