对于给定的数组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;
基于数组的位运算3 按bit位反转数组
最新推荐文章于 2024-02-29 11:23:21 发布
这篇博客介绍了如何使用位运算高效地反转给定的按位长度的uchar数组。通过构造一个16位整数反转表,实现了8位整数的反转,并利用该表反转任意位长度的数组,提高了算法性能。
摘要由CSDN通过智能技术生成