基于数组的位运算3 按bit位反转数组

这篇博客介绍了如何使用位运算高效地反转给定的按位长度的uchar数组。通过构造一个16位整数反转表,实现了8位整数的反转,并利用该表反转任意位长度的数组,提高了算法性能。
摘要由CSDN通过智能技术生成

  对于给定的数组uchar a[], 以及bit位长度(不是数组本身长度), 如何实现数组按位长度的反转算法, 效率一定要高哦
  大多数人首先想到的是首尾测试每个bit是否为0,1(本博客有关于如何测试,设置bit). 然后在交换bit位
这种算法的复杂度为位长度, 有没有办法进一步减小复杂度, 哪怕是常数因子也行,
  答案是有的, 请看下面详细代码描述, 基本思路是先构造一个16 bit的整数反转表
总体思想还是空间换时间, 毕竟没有免费的午餐.

typedef unsigned char uchar;
typedef unsigned short ushort;
typedef unsigned int uint;

//
//WordReverse[i] is equal to the bit reverse of i (i < 2^16)
static ushort WordReverse[1 << 16];

1. 下面先给出8bit整数按bit位反转实现
//reverse bit of a byte with binary representation
static uchar reverseByte(const uchar c)
{
//两个不同算法实现, 哪个性能更好取决于不同系统上的测试结果
#if 0
    return
        ((c * 0x80200802ULL) & 0x0884422110ULL) * 0x0101010101ULL >> 32;
#else
    uchar n =
        (c & 0x55) << 1 | (c & 0xAA) >> 1;
    n = (n & 0x33) << 2 | (n & 0xCC) >> 2;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值