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

10进制数转二进制表示

2012年05月30日 ⁄ 综合 ⁄ 共 1542字 ⁄ 字号 评论关闭

之前写了一篇文章,描述如何用bitset来表达计算机中存储的int变量的实际二进制布局,在工作中非常有用。

本篇是用算法自己实现10进制整数转换成二进制数。

逻辑上,如果将10进制数5用一个字节表示,应该是101,你可以通过000开始不断加1,得到这个数。但是实际上一般都采用除法计算。

5 / 2 

   得到商为 2 余数为1

用商2 / 2,

   得到商为1 余数为0

用商1 / 2

   得到商为0 余数为1

逆序将余数(最后得到的余数放在高位)连在一起就是 101.

这个算法用递归可以实现:

// Convert decimal integer in one byte to binary format string
string ByteToBinaryString(char v) {
    if (v == 1) {
        return "1"; 
    }
    
    if (v % 2 == 0) {
        return ByteToBinaryString(v / 2) + "0";
    } else {
        return ByteToBinaryString(v / 2) + "1";
    }
}

ByteToBinalyString实现存储在一个字节中的10进制整数转换成二进制表达的字符串的功能。

每次调用ByteToBinalyString,都先计算自己除以2的商和余数,用商继续递归调用自己。将余数接在下一个递归函数的返回值的后面,这样就实现了逆序。

出口在商为1的时候,这时候再用1调用自己时,直接返回“1”。

测试了一下,基本上在正数的时候没问题,如果是0呢,出现了错误。因为递归变成了无限,没有出口。所以还要加点代码,保证直接传递0为参数时,程序也能正常工作。

// Convert decimal integer in one byte to binary format string
string ByteToBinaryString(char v) {
    if (v == 1) {
        return "1"; 
    }
    
    if (v == 0) {
        return "0";
    }
    
    if (v % 2 == 0) {
        return ByteToBinaryString(v / 2) + "0";
    } else {
        return ByteToBinaryString(v / 2) + "1";
    }
}

现在考虑char的值小于0的情况。

-1按照前文:http://blog.csdn.net/sheismylife/article/details/7626219 描述,应该是11111111.  因为1是00000001, 取反后再加1即可。

显然这个程序还不能满足这个要求。先放在这里吧。

下面有一个更简单的方法,直接将系统内存的表示法打印出来。用按位与来碰撞。

// Get the bit value specified by the index
// index starts with 0
template<class T>
int Bit_Value(T value, uint8_t index) {
    return (value & (1 << index)) == 0 ? 0 : 1;
}

// T must be one of integer type
template<class T>
string PrintIntAsBinaryString(T v) {
    stringstream stream;
    int i = sizeof(T) * 8 - 1;
    while (i >= 0) {
        stream << Bit_Value(v, i);
        --i;
    }
    
    return stream.str();
}

现在检查一下-7的值:

    int8_t f = -7;
    string h = PrintIntAsBinaryString<int8_t>(f);
    cout << "h:" << h << endl;

h:11111001

7的值打印如下:

h:00000111

现在这个函数可以代替使用bitset的方法:http://blog.csdn.net/sheismylife/article/details/7625526

抱歉!评论已关闭.