将分数转换为二进制字符串?

时间:2016-03-22 21:08:46

标签: c# type-conversion

要手动将整数值转换为二进制字符串,您(一种技法是)将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; } 的浮点数)转换为二进制字符串。更具体地说,我应该使用什么算法。有人可以提出一个想法吗?

2 个答案:

答案 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; 
    }
}