2016-03-22 14 views
-1

整数値を手動でバイナリ文字列に変換するには、まで連続して2で割り、余りを逆の順序で追加します。分数をバイナリ文字列に変換しますか?

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ための浮動小数点数のような)分画に変換する方法を見つけ出すことができません。より具体的にはどのアルゴリズムを使用すべきですか?誰でもアイデアを提案できますか?

+3

だから、あなたが立ち往生しているもの?メソッドを選択するか実装するか?浮動小数点数がメモリ内でどのように表現されているかに精通していますか? ['BitConverter.GetBytes'](https://msdn.microsoft.com/en-us/library/yhwsaf3w(v = vs.110).aspx)の出力を取り出し、_thatをバイナリに変換しようとしましたか? –

+0

10進値をバイナリ文字列としてどのように表現するつもりですか?例: 3.14あなたが構築したいバイナリ表現を見ますか? –

答えて

1

手動

(注)入力が負であるか、またはゼロにすることができる整数であるのでことを、整数値を変換します。入力が0(それがstring.Emptyを返します)または負(それは何も返さないだろう)であるときしかしwhileループのためのあなたの条件はそのためwhile (n > 0)

で、あなたのコードは、今の状況に対処することはできません。それを修正する

、あなたが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; 
} 

を、あなたは何を取得する必要があります欲しいです。ここで

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; 
    } 
} 
関連する問題