无意间想到这个,写写:
#include <iostream>
template <typename IntType>
IntType binary_reverse(IntType number)
{
size_t bit_count = sizeof(IntType) << 3;
IntType max_signed = ~((IntType)1 << (bit_count - 1));
IntType rev_num = 0;
while (0 != number)
{
rev_num <<= 1;
rev_num |= number & 1;
number >>= 1;
number &= max_signed;
--bit_count;
}
rev_num <<= bit_count;
return(rev_num);
}
void test_bin_rev(void)
{
typedef int Integer;
Integer array[] = { -49, -1, 0, 1, 49 };
int size = sizeof(array) / sizeof(array[0]);
for (int i = 0; i < size; ++i)
{
Integer encrypt = binary_reverse(array[i]);
Integer decrypt = binary_reverse(encrypt);
std::cout << "source: " << array[i] << std::endl
<< "\tencrypt: " << encrypt << std::endl
<< "\tdecrypt: " << decrypt << std::endl;
}
}
int main(int argc, char * argv[])
{
test_bin_rev();
return(0);
}
总觉得我的代码风格不够美观,但又不知道怎么改进~
加种实现:
#include <iostream>
template <typename IntType>
inline void setbit(IntType & number, int pos)
{
number |= (IntType)1 << pos;
}
template <typename IntType>
inline void clrbit(IntType & number, int pos)
{
number &= ~((IntType)1 << pos);
}
template <typename IntType>
inline int getbit(IntType number, int pos)
{
return(((number &= (IntType)1 << pos) >> pos) & 1);
}
template <typename IntType>
IntType binary_reverse(IntType number)
{
size_t bit_count = sizeof(IntType) << 3;
for (int i = 0; i < bit_count / 2; ++i)
{
int j = bit_count - 1 - i;
int m = getbit(number, i);
int n = getbit(number, j);
if (m != n)
{
(0 == m) ? clrbit(number, j) : setbit(number, j);
(0 == n) ? clrbit(number, i) : setbit(number, i);
}
}
return(number);
}
void test_bin_rev(void)
{
typedef int Integer;
Integer array[] = { -49, -1, 0, 1, 49 };
int size = sizeof(array) / sizeof(array[0]);
for (int i = 0; i < size; ++i)
{
Integer encrypt = binary_reverse(array[i]);
Integer decrypt = binary_reverse(encrypt);
std::cout << "source: " << array[i] << std::endl
<< "\tencrypt: " << encrypt << std::endl
<< "\tdecrypt: " << decrypt << std::endl;
}
}
int main(int argc, char * argv[])
{
test_bin_rev();
return(0);
}