J'aimerais voir des entiers, positifs ou négatifs, en binaire.
Plutôt comme cette question , mais pour JavaScript.
javascript
numbers
barlop
la source
la source
Réponses:
Vous pouvez utiliser la
Number.toString(2)
fonction, mais elle a quelques problèmes lors de la représentation des nombres négatifs. Par exemple, la(-1).toString(2)
sortie est"-1"
.Pour résoudre ce problème, vous pouvez utiliser l'opérateur au niveau du bit de décalage à droite non signé (
>>>
) pour contraindre votre numéro à un entier non signé.Si vous exécutez,
(-1 >>> 0).toString(2)
vous décalerez votre nombre de 0 bits vers la droite, ce qui ne change pas le nombre lui-même mais il sera représenté comme un entier non signé. Le code ci-dessus sortira"11111111111111111111111111111111"
correctement.Cette question a une explication supplémentaire.
la source
Essayer
Le 2 est le radix et peut être n'importe quelle base entre 2 et 36
source ici
METTRE À JOUR:
Cela ne fonctionnera que pour les nombres positifs, Javascript représente des entiers binaires négatifs en notation à complément à deux. J'ai fait cette petite fonction qui devrait faire l'affaire, je ne l'ai pas testée correctement:
J'ai eu de l'aide d' ici
la source
-3
retours1
). Je pense aussi que celadec > 0
devrait êtredec >= 0
, ce qui devrait au moins fixer 0. Parce que lesdec2Bin(0)
retours10
.Le binaire dans 'convertir en binaire' peut se référer à trois choses principales. Le système de nombres positionnels, la représentation binaire en mémoire ou les chaînes de bits 32 bits. (pour les chaînes de bits 64 bits, voir la réponse de Patrick Roberts )
1. Système de numérotation
(123456).toString(2)
convertira les nombres en système de chiffres positionnels de base 2 . Dans ce système, les nombres négatifs sont écrits avec des signes négatifs comme en décimal.2. Représentation interne
La représentation interne des nombres est une virgule flottante de 64 bits et certaines limitations sont discutées dans cette réponse . Il n'y a pas de moyen facile de créer une représentation de chaîne de bits de cela en javascript ni d'accéder à des bits spécifiques.
3. Masques et opérateurs au niveau du bit
MDN a une bonne vue d' ensemble du fonctionnement des opérateurs au niveau du bit. Surtout:
Avant d'appliquer les opérations, les nombres à virgule flottante 64 bits sont convertis en entiers signés 32 bits. Une fois qu'ils sont reconvertis.
Voici l'exemple de code MDN pour convertir des nombres en chaînes 32 bits.
la source
Un moyen simple est juste ...
la source
(42).toString(2)
42..toString(2)
1.
ce qui est identique1.0
ou juste1
(et de même, vous pouvez également omettre la partie avant et écrire à la.5
place de0.5
). Ainsi, dans l'exemple, le premier point est le séparateur décimal qui fait partie du nombre et le deuxième point est l'opérateur de point pour appeler la méthode sur ce nombre. Vous devez utiliser deux points (ou encapsuler le nombre entre parenthèses) et ne pouvez pas simplement écrire42.toString(2)
car l'analyseur voit le point comme séparateur décimal et renvoie une erreur en raison d'un opérateur de point manquant.Cette réponse tente d'adresser les entrées avec une valeur absolue dans la plage de 2147483648 10 (2 31 ) - 9007199254740991 10 (2 53 -1).
En JavaScript, les nombres sont stockés dans une représentation en virgule flottante 64 bits , mais les opérations au niveau du bit les contraignent à des entiers 32 bits au format complément à deux , de sorte que toute approche qui utilise des opérations au niveau du bit limite la plage de sortie à -2147483648 10 (-2 31 ) - 2147483647 10 (2 31 -1).
Cependant, si les opérations au niveau du bit sont évitées et que la représentation en virgule flottante 64 bits est préservée en utilisant uniquement des opérations mathématiques, nous pouvons convertir de manière fiable tout entier sûr en notation binaire complémentaire à deux bits 64 bits en étendant les 53 bits
twosComplement
:Pour les navigateurs plus anciens, des polyfills existent pour les fonctions et valeurs suivantes:
Number.isSafeInteger()
Number.isInteger()
Number.MAX_SAFE_INTEGER
String.prototype.padStart()
En prime, vous pouvez prendre en charge n'importe quel radix (2–36) si vous effectuez la conversion du complément à deux pour les nombres négatifs en chiffres ⌈64 / log 2 (radix) ⌉ en utilisant
BigInt
:Si vous êtes intéressé par mon ancienne réponse qui utilisait an
ArrayBuffer
pour créer une union entre aFloat64Array
et aUint16Array
, veuillez vous référer à l' historique de révision de cette réponse .la source
-(2**53)-1
au2**53-1
lieu de simplement-(2**31)
à2**31-1
comme la réponse de annan.Une solution avec laquelle j'irais bien pour 32 bits, est le code à la fin de cette réponse, qui est de developer.mozilla.org (MDN), mais avec quelques lignes ajoutées pour A) le formatage et B) en vérifiant que le le nombre est dans la plage.
Certains ont suggéré
x.toString(2)
que cela ne fonctionne pas pour les négatifs, il colle simplement un signe moins pour eux, ce qui n'est pas bon.Fernando a mentionné une solution simple
(x>>>0).toString(2);
qui convient aux négatifs, mais a un léger problème lorsque x est positif. Il a la sortie commençant par 1, ce qui pour les nombres positifs n'est pas le bon complément à 2.Quiconque ne comprend pas le fait de nombres positifs commençant par 0 et de nombres négatifs avec 1, en complément 2s, pourrait vérifier ce SO QnA sur complément 2s. Qu'est-ce que le «complément 2»?
Une solution pourrait consister à ajouter un 0 pour les nombres positifs, ce que j'ai fait dans une révision précédente de cette réponse. Et on pourrait accepter d'avoir parfois un nombre 33 bits, ou on pourrait s'assurer que le nombre à convertir est dans la plage - (2 ^ 31) <= x <2 ^ 31-1. Le nombre est donc toujours de 32 bits. Mais plutôt que de le faire, vous pouvez opter pour cette solution sur mozilla.org
La réponse et le code de Patrick sont longs et fonctionnent apparemment pour 64 bits, mais il y avait un bogue trouvé par un commentateur et le commentateur a corrigé le bogue de patrick, mais patrick a un "numéro magique" dans son code qu'il n'a pas commenté et a oublié et patrick ne comprend plus pleinement son propre code / pourquoi il fonctionne.
Annan avait une terminologie incorrecte et peu claire mais a mentionné une solution par developer.mozilla.org https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators Cela fonctionne pour les nombres 32 bits.
Le code est assez compact, une fonction de trois lignes.
Mais j'ai ajouté une expression régulière pour formater la sortie en groupes de 8 bits. Basé sur Comment imprimer un nombre avec des virgules en tant que milliers de séparateurs en JavaScript (je viens de le modifier en le regroupant en 3 secondes de droite à gauche et en ajoutant des virgules , en le regroupant en 8 secondes de droite à gauche et en ajoutant des espaces )
Et, alors que mozilla a fait un commentaire sur la taille de nMask (le nombre introduit) ... qu'il doit être dans la plage, ils n'ont pas testé ou jeté une erreur lorsque le nombre est hors plage, donc j'ai ajouté cela.
Je ne sais pas pourquoi ils ont nommé leur paramètre 'nMask' mais je laisserai cela tel quel.
Référence: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators
la source
Vous pouvez écrire votre propre fonction qui renvoie un tableau de bits. Exemple comment convertir un nombre en bits
Diviseur | Dividende | bits / reste
2 | 9 | 1
2 | 4 | 0
2 | 2 | 0
~ | 1 | ~
exemple de ligne ci-dessus: 2 * 4 = 8 et le reste est 1 donc 9 = 1 0 0 1
Lisez les restes de bas en haut. Chiffre 1 du milieu vers le haut.
la source
Math.floor(number%2)
lieu denumber = Math.floor(number/2)
?J'ai utilisé une approche différente pour trouver quelque chose qui fait cela. J'ai décidé de ne pas utiliser ce code dans mon projet, mais j'ai pensé le laisser dans un endroit pertinent au cas où il serait utile pour quelqu'un.
la source
Encore une alternative
la source
Voici mon code:
la source
Voilà la solution. C'est assez simple en fait
la source