2010-09-13 6 views
9

J'écris un convertisseur numérique. Comment puis-je convertir un entier en une chaîne binaire en C# SANS en utilisant des fonctions intégrées (Convert.ToString fait des choses différentes en fonction de la valeur donnée)?Comment convertir un nombre entier en chaîne binaire en C#?

  • binaire -> magnitude de signe
  • binaire -> Un complément à
  • binaire> complément à deux

Répondre

17

Presque tous les ordinateurs utilisés aujourd'hui la représentation de complément à deux en interne, donc si vous faites une conversion simple comme celui-ci, vous obtiendrez les deux la chaîne de complément:

public string Convert(int x) { 
    char[] bits = new char[32]; 
    int i = 0; 

    while (x != 0) { 
    bits[i++] = (x & 1) == 1 ? '1' : '0'; 
    x >>= 1; 
    } 

    Array.Reverse(bits, 0, i); 
    return new string(bits); 
} 

C'est votre base pour les deux conversions restantes. Pour signe de magnitude, il suffit d'extraire le signe préalable et convertir la valeur absolue:

byte sign; 
if (x < 0) { 
    sign = '1'; 
    x = -x; 
} else { 
    sign = '0'; 
} 
string magnitude = Convert(x); 

Pour son complément, soustrayez un si le nombre est négatif:

if (x < 0) 
    x--; 
string onec = Convert(x); 
6

Au moins une partie de la réponse consiste à utiliser decimal.GetBits(someValue) pour convertir la décimale à sa représentation binaire .

BitConverter.GetBytes peut être utilisé, à son tour, sur les éléments retournés de decimal.GetBits() pour convertir des entiers en octets.

Vous pouvez trouver le decimal.GetBits() documentation utile. Cependant, je ne suis pas sûr de savoir comment passer des octets à la décimale.

Mise à jour: Sur la base de la mise à jour de l'auteur:

BitConverter contient des méthodes pour convertir le nombre d'octets, ce qui est pratique pour obtenir la représentation binaire. Les méthodes GetBytes() et ToInt32() sont pratiques pour les conversions dans chaque direction. Les surcharges ToString() sont pratiques pour créer une représentation de chaîne hexadécimale si vous trouvez cela plus facile à interpréter comme 1 et 0.

+0

si Bitconverter.GetBytes peut retourner les bits en octets, puis de passer des octets aux ints c'est juste BitConverter.GetInt32 (byte [] bytes) –

+0

@Jimmy - Merci. Le chaînon manquant pour moi est de comprendre comment convertir au type 'decimal' à partir d'un tableau d'octets ou d'un tableau de Int32. – kbrimington

0

Ceci est une mise en œuvre dangereuse:

private static unsafe byte[] GetDecimalBytes(decimal d) 
    { 
     byte* dp = (byte*) &d; 
     byte[] result = new byte[sizeof(decimal)]; 
     for (int i = 0; i < sizeof(decimal); i++, dp++) 
     { 
      result[i] = *dp; 
     } 
     return result; 
    } 

Et voici revenir en arrière:

private static unsafe decimal GetDecimal(Byte[] bytes) 
    { 
     if (bytes == null) 
      throw new ArgumentNullException("bytes"); 

     if (bytes.Length != sizeof(decimal)) 
      throw new ArgumentOutOfRangeException("bytes", "length must be 16"); 

     decimal d = 0; 
     byte* dp = (byte*)&d; 
     byte[] result = new byte[sizeof(decimal)]; 
     for (int i = 0; i < sizeof(decimal); i++, dp++) 
     { 
      *dp = bytes[i]; 
     } 
     return d; 
    } 
0

Vous pouvez construire les représentations chiffre par chiffre des premiers principes.

Vous ne savez pas quelles fonctions intégrées vous ne souhaitez pas utiliser, mais vous pouvez probablement créer une chaîne caractère par caractère?

  1. Commencez par la puissance la plus élevée de deux supérieure au nombre.
  2. Enfoncez un "1" dans votre chaîne. Soustrayez cette puissance de deux de votre numéro. Prenez la deuxième puissance la plus basse de deux. Si vous avez atteint la moitié, arrêtez. Vous avez terminé.
  3. Si le nombre qui reste supérieur à ce pouvoir de deux, revenez à l'étape 2. Sinon, appuyez sur « 0 » dans la chaîne et revenir à l'étape 4.

Pour un complément à et complément à deux, calculate those with an additional step.

Ou est-ce trop basique pour ce dont vous avez besoin?

0

Voici une solution élégante:

// Convert Integer to binary and return as string 
private static string GetBinaryString(Int32 n) 
{ 
    char[] b = new char[sizeof(Int32) * 8]; 

    for (int i = 0; i < b.Length; i++) 
     b[b.Length-1 - i] = ((n & (1 << i)) != 0) ? '1' : '0'; 

    return new string(b).TrimStart('0'); 
} 
13

simple soution:

IntToBinValue = Convert.ToString(6, 2); 
3
var a = Convert.ToString(4, 2).PadLeft(8, '0'); 
Questions connexes