要手动将整数值转换为二进制字符串,您(一种技法是)将2y
连续除以商2
,并以相反的顺序附加余数。
> 0
但是,我无法弄清楚如何将分数(例如string decimalToBinary(int n)
{
string binary = string.Empty;
while (n > 0)
{
// get the LSB
int remainder = n % 2;
// truncate the LSB
n /= 2;
// insert remainder in front
binary = remainder.ToString() + binary;
}
return binary;
}
的浮点数)转换为二进制字符串。更具体地说,我应该使用什么算法。有人可以提出一个想法吗?
答案 0 :(得分:1)
要手动转换整数值
请注意,因为您的输入是一个整数,可以是负数或零。但是while
循环的条件是while (n > 0)
因此,当输入为0
(它将返回string.Empty
)或为负数(它将不返回任何内容)时,您的代码现在无法处理这种情况。
要解决此问题,您可以考虑将输入更改为uint
并为n == 0
提供特殊情况:
string decimalToBinary(uint n) //note this uint
{
if (n == 0) //special case
return "0";
string binary = string.Empty;
while (n > 0)
{
// get the LSB
uint remainder = n % 2;
// truncate the LSB
n /= 2;
// insert remainder in front
binary = remainder.ToString() + binary;
}
return binary;
}
或者你在内部改变它:
private string decimalToBinary(int n) {
string binary = string.Empty;
if (n == 0)
return "0";
uint p = (uint)n; //note this cast
while (p > 0) {
// get the LSB
uint remainder = p % 2;
// truncate the LSB
p /= 2;
// insert remainder in front
binary = remainder.ToString() + binary;
}
return binary;
}
然后你应该得到你想要的东西。
答案 1 :(得分:0)
这是一个用于分数到二进制转换的C ++实现:
double frac = .1;
int digits = 1, intpart;
cout <<".";
while (digits < 32 && frac != 0.)
{
frac = frac * 2;
intpart = frac;
frac = frac - intpart;
cout << intpart;
digits++;
}
输出:.0001100110011001100110011001100
或使用递归:
#include <iostream>
using namespace std;
void fractobin(double frac, int digits);
//==========================================================
int main()
{
cout <<".";
fractobin(.1, 1);
return 0;
}
//==========================================================
void fractobin(double frac, int digits)
{
int intpart;
if (digits >=32 || frac==0.)
{
return;
}
else
{
frac = frac * 2;
intpart = frac;
cout << intpart;
fractobin(frac - intpart, ++digits);
return;
}
}