【问题标题】:Converting fractions to binary string?将分数转换为二进制字符串?
【发布时间】:2016-03-22 21:08:45
【问题描述】:

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

【问题讨论】:

  • 那么你坚持什么?选择一种方法还是实施它?您是否熟悉浮点数在内存中的表示方式?您是否尝试过获取BitConverter.GetBytes 的输出并将_that 转换为二进制?
  • 您打算如何将十进制值表示为二进制字符串?应该如何3.14 看一下你要构造的二进制表示?

标签: c# type-conversion


【解决方案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;
}

那么你应该得到你想要的。

【讨论】:

    【解决方案2】:

    下面是分数到二进制转换的 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; 
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-02-24
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-02
      相关资源
      最近更新 更多