2011-06-29 3 views
1

入力として与えられた10進数の補数を見つける必要があります。私はこれを行うとき、まず私は、入力として8を与えたときに、たとえば、変な答えを得る1の補数を得る方法

int onesComplement= ~(int.parse(binRep)), 

、その後、次のコードを使用して進数10進数、

int decNum = int.Parse(Console.ReadLine()); 
string binRep = " "; 
int digi = 0; 
do 
{ 
    digi = decNum % 2; 
    binRep = digi.ToString() + binRep; 
    decNum = decNum/2; 
} while (decNum >= 1); 
Console.WriteLine(binRep); 

を変換するIバイナリ数として1000を取得しますが、補数を得るためにチルダ(〜)を使用した後は-1001が得られます。私はここで何が欠けているのかを知りたいです。そして、人の補完を正しく得るためにはどうすればいいですか?

+4

そのコードはCではありません。 – interjay

+0

@interjay:ねえ、十分に近いですか? (C#にタグ付けされています) – user7116

+1

ビットトゥイリングを行っている場合は、符号なしタイプを使用してください。 –

答えて

1

int.Parseは、文字列が10進数(1000)を表していると考えます。

2

int.Parse()の場合、ベース10を使用しているため、1000bではなく10bitsのリテラルベースとして読み込みます。 Int32.Parseは2進数をサポートしていません。

これを回避するには、元の番号に~を使用してビット単位の補数を実行し、それらの2進数を出力します。ここで

は、必要に応じてそれを反転、32ビット数のバイナリ表現を返すために、あなたのコードの若干の変更である:デフォルトでは

static string GetBinary(string number, bool invert) 
{ 
    // use unsigned ints to avoid negative number problems 
    uint decNum = UInt32.Parse(number); 
    if (invert) decNum = ~decNum; 

    string binRep = String.Empty; 
    uint digi = 0; 
    do 
    { 
     digi = decNum % 2; 
     binRep = digi.ToString() + binRep; 
     decNum = decNum/2; 
    } while (decNum >= 1); 

    return binRep; 
} 
+0

ありがとう、sixlettervariables、それは素晴らしい仕事をした! – jays

5

整数は、それがベース10であるかのように解析され、そしてあなたが」didnのさ別のベースを指定しない - int.Parse()はこれを提供しません。 Convert.ToInt32()を代わりに使用し、数字が基になる基数を指定することができます(ケース2)。

は 等価の32ビット符号付き整数に指定された塩基で 数の文字列表現に変換します。

ので、あなたのプログラムはまたに短縮することが可能

int onesComplement= ~Convert.ToInt32(binRep, 2); 

を使用する:あなたは、バイナリ出力を印刷する必要がない場合

int decNum = int.Parse(Console.ReadLine()); 
string binRep = Convert.ToString(decNum, 2); 
Console.WriteLine(binRep); 
int onesComplement = ~Convert.ToInt32(binRep, 2); 

かさえ短い:

int decNum = int.Parse(Console.ReadLine()); 
int onesComplement = ~decNum; 
+1

+1、Convert.ToInt32を使ってベースを指定できることはわかりませんでした。 –

関連する問題