2009-10-19 7 views
2

Je suis en train de lire le livre de Charles Petzold 'Code'. Dans ce document, il explique comment convertir un nombre décimal en binaire en utilisant le modèle suivant:Conversion d'un nombre décimal en binaire

   [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] 
       ÷128 ÷64 ÷32 ÷16 ÷8 ÷4 ÷2 ÷1 
       [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] 

Dans le livre, son explication sur la façon d'utiliser le modèle lit comme suit:

« Mettre tout le nombre décimal (inférieur ou égal à 255) dans la case située dans le coin supérieur gauche Divisez ce nombre (le dividende) par le premier diviseur (128), en indiquant , puis placez le quotient dans la case ci-dessous (la case en bas à gauche coin), et le reste dans la case à droite (la deuxième case sur la ligne du haut) .Ce premier reste est le dividende pour le prochain calcul, qui utilise un diviseur de 64. Continuez de la même manière à travers le gabarit. Gardez à l'esprit que chaque quotient sera 0 ou 1. Si le dividende est inférieur au diviseur, le quotient est 0 et le reste est simplement le dividende. si le dividende est supérieur ou égal au diviseur, le quotient est 1 et le reste est le diviseur - le diviseur. Voici comment faire avec 150:. »

   [150] [22] [22] [22] [6 ] [6 ] [2 ] [0 ] 
       ÷128 ÷64 ÷32 ÷16 ÷8  ÷4  ÷2  ÷1 
       [1 ] [0 ] [0 ] [1 ] [0 ] [1 ] [1 ] [0 ] 

Mais je suis perplexe quand je fais les calculs comme indiqué, je reçois des résultats très différents Ce que je fais est la suivante:

150 ÷ ​​128 = 1.171875 (Je ne vois pas d'où vient le 22 ci-dessus?) Donc, je place un 1 dans la boîte ci-dessous le 150 et ensuite porter le et l'utiliser comme le dividende pour le prochain calcul, qui bien sûr me met dans toutes sortes de problèmes, et, finalement, pas le nombre binaire 10010110!

Quelqu'un peut-il me dire où je vais mal?

+2

Division entière: 'a = qd + r':' 0 <= r

Répondre

7

22 est le reste de 150/128.Puisque vous avez déterminé qu'il y a 1 128 "dans" 150, et donné une valeur à ce bit, vous pouvez oublier le 128 qui est "dans" 150, donc vous l'éloignez de 150, laissant notre 22. Ensuite, il est temps pour le chiffre vaut 64: 64 ne va pas dans 22, donc ce chiffre est un 0. Et de même pour le chiffre vaut 32. Ensuite, pour le chiffre vaut 16: 16 passe en 22 une fois, donc il y a un chiffre là, et maintenant vous avez terminé avec le 16 "in" 22, alors enlevez-en - laissant 6. Et ainsi de suite.

(Considérons un cas de base 10 similaire, disons 309. Prenez la colonne 100s, il y en a 3 100s dans 309, alors vous mettez un 3 là-bas et maintenant il y en a encore 9. Prenez la colonne 10s, il y a 0 10s dans 9, donc vous mettez un 0 là et puis la colonne 1s: il y a 9 1s dans 9, donc vous mettez un 9 là et maintenant il n'y a plus rien - vous avez terminé.)

J'ai un horrible sentiment que cela pourrait embrouiller plus que clarifier, mais c'est de cette façon que je pense de toute façon.

+0

Fantastique - merci! EXACTEMENT ce que j'étais après! – cw84

5

Le 22 est le reste.
150/128 = 1 reste 22

+0

haha. Je n'aurais pas pu dire mieux moi-même. – nall

4

Vous devez faire integer division.

// Floating point 
150 ÷ 128 = 1.171875 

// Integer 
150 ÷ 128 = 1 remainder 22 

Alors, vous écrivez le 1 et portez 22 à l'étape suivante.

0

L'exemple utilise des opérations entières et 150 - 128 => 22.

L'exemple est délibérément algébrique, mais la plupart des langages modernes définissent des opérateurs binaires bit à bit. (Vraisemblablement, ceux-ci seront émulés si jamais nous construisons des ordinateurs non binaires.) Il serait donc assez rare de faire une conversion binaire de cette façon. Plus généralement, vous utiliserez <<, >> et & pour détecter des bits individuels directement.

2

128 passe une fois sur 150 avec 22 restant. Le nombre binaire 10010110 se traduit par le nombre décimal;

150 = (1 * 128) + (1 * 16) + (1 * 4) * (1 + 2) = 128+16+4+2 

De la même manière, nous pourrions décomposer le nombre décimal 150;

150 = (1 * 100) + (5 * 10) + (0 * 1) = 100 + 50 
Questions connexes