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