您的位置:首页 > 其它

整数二进制位反转

2012-10-26 00:24 381 查看
无意间想到这个,写写:

#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);
}


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: