现在的位置: 首页 > 综合 > 正文

整数二进制位反转

2013年01月28日 ⁄ 综合 ⁄ 共 1716字 ⁄ 字号 评论关闭

无意间想到这个,写写:

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

 

 

抱歉!评论已关闭.