在Matlab中,可以通过调用bitrevorder()函数轻松实现对一个整型数字的比特位反转,但是C/C++的math.h库中并没有对于此函数的实现:
1、二进制表示:对需要进行比特位反转的整型数字,将其用指定位数的二进制数表示出来。如用3位二进制数表示1(011),用4位二进制数表示1(0011)。
2、比特位反转:将二进制数的高低位的次序反转一下,即最低位变为最高位,次低位变为次高位,依次执行反转过程。如二进制001反转后为100,二进制110反转后为011。
3、十进制表示:将比特位反转后的二进制转化为十进制整型数字。如十进制数字1(001)反转后为十进制数字4(100),十进制数字6(110)反转后为十进制数字3(011)。
Linear Index | Bits | Bit- Reversed | Bit-Reversed Index |
1 | 001 | 100 | 4 |
6 | 110 | 011 | 3 |
1 | 0001 | 1000 | 8 |
6 | 0110 | 0110 | 6 |
根据所需反转十进制数的不同二进制数字的表示不同,例如对十进制数1使用2位或者3位二进制数表示,其反转后的结果也是不一样的,因此比特位数执行反转过程中的一个重要参数。
在Matlab中通常是对一个向量执行反转,其向量中最大元素的比特位数决定了整个向量的共同的比特位数。因此将bitrevorder函数使用C/C++实现时需要手动传入该参数。
unsigned short bitReverse(unsigned short x, unsigned short bitNum)
{
unsigned short i = 0;
unsigned short result = 0;
vector<int> v1;
do
{
i++;
v1.push_back(x % 2);
x /= 2;
} while (x != 0);
for (i; i < bitNum; i++)
{
v1.push_back(0);
}
reverse(v1.begin(), v1.end());
for (int j = 0; j < v1.size(); j++)
{
result += v1[j] * pow(2, j);
}
return result;
}
其中函数的输入是需要反转的十进制数(x)和其二进制表示时的比特位数(bitNum),函数的返回值是一个反转后的十进制数。