web-dev-qa-db-fra.com

Conversion décimale en binaire pour les grands nombres dans Excel

J'ai un grand nombre dans une feuille Excel et je veux les convertir en binaires, par exemple 12345678 965321458 -12457896 Quelqu'un pourrait-il m'aider à faire cela . Merci.

14
user3103991

Si nous parlons d'un nombre positif entre 0 et 2^32-1, vous pouvez utiliser cette formule:

=DEC2BIN(MOD(QUOTIENT($A$1,256^3),256),8)&DEC2BIN(MOD(QUOTIENT($A$1,256^2),256),8)&DEC2BIN(MOD(QUOTIENT($A$1,256^1),256),8)&DEC2BIN(MOD(QUOTIENT($A$1,256^0),256),8)

REMARQUE: La fonction=DEC2BIN() ne peut pas traiter les nombres supérieurs à 511. Vous verrez donc ma formule diviser votre nombre en quatre morceaux de 8 bits, les convertir au format binaire puis concaténer les résultats.

Eh bien, en théorie, vous pouvez étendre cette formule à six morceaux de 8 bits. La précision maximale que vous pouvez obtenir dans Excel est de 15 (quinze) décimales. En cas de dépassement, seuls les 15 chiffres les plus significatifs restent, le reste est arrondi. C'est à dire. Si vous tapez 12345678901234567, Excel le stockera sous le nom 12345678901234500. Donc, puisque 2^48-1 contient 15 chiffres décimaux, le nombre ne sera pas arrondi.

44
Taosique

Voir VBA posté ici

' The DecimalIn argument is limited to 79228162514264337593543950245
' (approximately 96-bits) - large numerical values must be entered
' as a String value to prevent conversion to scientific notation. Then
' optional NumberOfBits allows you to zero-fill the front of smaller
' values in order to return values up to a desired bit level.
Function DecToBin(ByVal DecimalIn As Variant, Optional NumberOfBits As Variant) As String
  DecToBin = ""
  DecimalIn = CDec(DecimalIn)
  Do While DecimalIn <> 0
    DecToBin = Trim$(Str$(DecimalIn - 2 * Int(DecimalIn / 2))) & DecToBin
    DecimalIn = Int(DecimalIn / 2)
  Loop
  If Not IsMissing(NumberOfBits) Then
    If Len(DecToBin) > NumberOfBits Then
      DecToBin = "Error - Number too large for bit size"
    Else
      DecToBin = Right$(String$(NumberOfBits, "0") & _
      DecToBin, NumberOfBits)
    End If
  End If
End Function
6
JustinJDavies

Je viens d'essayer la formule ci-dessus et j'ai constaté que Microsoft avait foiré la fonction DEC2BIN d'une autre manière qui empêche la formule de fonctionner correctement avec des nombres négatifs. En interne, DEC2BIN utilise un résultat de dix bits; Les zéros au début sont supprimés du résultat du texte, sauf si le paramètre optionnel length est utilisé, auquel cas le nombre requis de zéros au début est laissé dans la chaîne. Mais voici le problème: un nombre négatif commence toujours par un, il n'y a donc pas de zéros au début, donc DEC2BIN affichera toujours les dix bits! Ainsi, DEC2BIN (-1,8), qui devrait afficher 11111111 (huit unités), affichera plutôt 1111111111 (dix unités).

Pour résoudre ce problème, utilisez DROITE pour couper chaque bloc de huit bits à huit bits, aussi stupide que cela puisse paraître.

=RIGHT(DEC2BIN(QUOTIENT(A1,256^3),8),8) & RIGHT(...

(J'ai lu la VBA et elle n'a pas le même problème, mais il ne semble pas qu'elle puisse gérer les négatifs.)

5
Joe Avins

Pour ajouter une mise en forme plus facile à lire à l'excellente réponse de Taosique, vous pouvez également la scinder en morceaux de 4 bits avec des espaces entre eux, bien que la formule devienne un monstre:

=DEC2BIN(MOD(QUOTIENT($A$1,16^7),16),4)&" "&DEC2BIN(MOD(QUOTIENT($A$1,16^6),16),4)&" "&DEC2BIN(MOD(QUOTIENT($A$1,16^5),16),4)&" "&DEC2BIN(MOD(QUOTIENT($A$1,16^4),16),4)&" "&DEC2BIN(MOD(QUOTIENT($A$1,16^3),16),4)&" "&DEC2BIN(MOD(QUOTIENT($A$1,16^2),16),4)&" "&DEC2BIN(MOD(QUOTIENT($A$1,16^1),16),4)&" "&DEC2BIN(MOD(QUOTIENT($A$1,16^0),16),4)

1101 0100 1111 0110 0011 0001 0000 0001

Bien sûr, vous pouvez simplement utiliser la moitié droite de celle-ci, si vous êtes simplement intéressé par les nombres 16 bits:

=DEC2BIN(MOD(QUOTIENT($A$1,16^3),16),4)&" "&DEC2BIN(MOD(QUOTIENT($A$1,16^2),16),4)&" "&DEC2BIN(MOD(QUOTIENT($A$1,16^1),16),4)&" "&DEC2BIN(MOD(QUOTIENT($A$1,16^0),16),4)

0011 0001 0000 0001
2
Nate

Quelqu'un peut trouver les opérations de décalage binaire plus claires et pertinentes ici

=DEC2BIN(BITRSHIFT($A$1,24),8) & DEC2BIN(MOD(BITRSHIFT($A$1,16),256),8) & DEC2BIN(MOD(BITRSHIFT($A$1,8),256),8) & DEC2BIN(MOD($A$1,256),8)

Cette formule est pour les valeurs 32 bits

1
Geom

Cette fonction vba résout le problème de la conversion binaire de nombres supérieurs à 511, impossible avec WorksheetFunction.dec2bin.
Le code tire parti de la fonction WorksheetFunction.dec2bin en l’appliquant par morceaux.

Function decimal2binary(ByVal decimal2convert As Long) As String
Dim rest As Long
If decimal2convert = 0 Then
   decimal2binary = "0"
   Exit Function
End If
Do While decimal2convert > 0
   rest = decimal2convert Mod 512
   decimal2binary = Right("000000000" + WorksheetFunction.Dec2Bin(rest), 9) + decimal2binary
   decimal2convert = (decimal2convert - rest) / 512
Loop
decimal2binary = Abs(decimal2binary)
End Function
1
Diego

Bien que je n’ai pas écrit cela pour les négatifs ou les décimales, il devrait être relativement facile à modifier. Ce VBA convertira n'importe quel décimal super grand (ou moins grand si vous voulez, mais ce n'est pas le point) jusqu'au résultat binaire converti contenant jusqu'à 32767 chiffres (longueur de chaîne maximale en VBA).

Entrez décimal dans la cellule "A1" en tant que chaîne, le résultat sera dans "B1" en tant que chaîne.

Dim NBN As String

Dim Bin As String

5 Big = Range("A1")

AA = Len(Big)

For XX = 1 To AA

L1 = Mid(Big, XX, 1) + CRY

CRY = 0

If L1 = 0 Then

FN = "0"

GoTo 10

End If

If Int(L1 / 2) = L1 / 2 Then

FN = L1 / 2

GoTo 10

End If

If Int(L1 / 2) <> L1 / 2 Then

FN = Int(L1 / 2)

CRY = 10

GoTo 10

End If

10 NBN = NBN & FN

Next XX

If Left(NBN, 1) = "0" Then

NBN = Right(NBN, (Len(NBN) - 1))

End If

If CRY = 10 Then Bin = "1" & Bin Else Bin = "0" & Bin

Range("A1") = NBN

Range("A2") = Bin

If Len(NBN) > 0 Then

NBN = ""

CRY = 0

GoTo 5

End If
0
jbs3141

Voici un autre moyen. Ce n'est pas avec une seule formule, mais j'ai essayé et converti au nombre 2.099.999.999.999. Mon intention première était de construire un compteur 51 bits, mais de toute façon cela ne fonctionne pas avec des nombres au-delà de celui que j'ai mentionné. Télécharger depuis http://www.excelexperto.com/content/macros-production/contador-binario-de-51-bits/

J'espère que c'est utile. Cordialement.

0
Víctor Urbina