之前写了一篇文章,描述如何用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进制整数转换成二进制表达的字符串的功能。
出口在商为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