2011-06-29 2 views
1

Je dois trouver ceux de complément d'un nombre décimal donné en entrée. Tout d'abord je convertir le nombre décimal en un nombre binaire en utilisant le code suivant,Comment obtenir les complément à

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); 

puis quand je le fais,

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

Je reçois des réponses bizarres, par exemple quand je donne 8 comme entrée I obtenir 1000 comme le nombre binaire, mais après avoir utilisé le tilde (~) pour obtenir le complément, je reçois -1001. Je voudrais savoir ce qui me manque ici, et que dois-je faire de mieux pour obtenir son complément correctement?

+4

Ce code n'est pas C. – interjay

+0

@interjay: hey, c'est assez proche non? (reclassé en C#) – user7116

+1

utiliser des types non signés si vous faites un peu twiddling. –

Répondre

1

int.Parse pense que votre chaîne représente un nombre décimal (1000).

2

Vous obtenez les nombres étranges parce que quand vous faites int.Parse() il utilise la base 10, donc plutôt que 1000b il lit cela comme la base littérale 10 entier 1.000. Int32.Parse ne prend pas en charge les nombres binaires.

Pour contourner ce problème, vous pouvez effectuer le complément de l'aide ~ sur bitwise le numéro original et imprimer ces chiffres binaires.

Voici une légère modification de votre code pour retourner la représentation binaire d'un nombre de 32 bits, inversant optionnellement:

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

merci sixlettervariables, ça a bien fonctionné! – jays

5

Par défaut, le nombre entier est analysé comme si elle est base 10, et vous n » ai pas t spécifier une base différente - int.Parse() n'offre pas cela. Vous pouvez utiliser Convert.ToInt32() à la place et spécifier la base sur laquelle le numéro est basé, dans votre cas 2.

convertit la représentation de chaîne de un nombre spécifié dans une base à un équivalent entier signé 32 bits.

donc utiliser

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

Votre programme peut également être raccourci à:

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

ou encore plus court si vous n'avez pas besoin d'imprimer la sortie binaire:

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

+1, je ne savais pas qu'en utilisant Convert.ToInt32 vous pouvez spécifier la base. –

Questions connexes