无意间想到这个,写写:
#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); }