Comment puis-je convertir un nombre entier en binaire en JavaScript?
J'aimerais voir des nombres entiers, positifs ou négatifs, en binaire.
Plutôt comme cette question, mais pour le JavaScript.
- le un.toString(2) exemples ne semblent pas fonctionner pour -1
- Il est également possible de convertir de binaire en décimal: stackoverflow.com/questions/11103487/...
- Et quand j'ai dit "binaire", peut-être un peu ambiguë. Je veux dire à l'intérieur de chaînes de bits de la représentation, qui est 2s compléter, de sorte que les nombres positifs seraient en base 2, et avec un 0, (et les nombres négatifs ne serait pas écrit avec un signe moins ( - ) ou avec le signe de l'ampleur de la représentation, mais en fonction de leur eqivalent)
Vous devez vous connecter pour publier un commentaire.
Cette réponse tente d'aborder des entiers avec des valeurs absolues entre
Number.MAX_SAFE_INTEGER
(ou2**53-1
) et2**31
. Les solutions actuelles seule adresse entiers signés au sein de 32 bits, mais cette solution de sortie de 64 bits en complément à deux formulaire à l'aide defloat64ToInt64Binary()
:JS:
CSS:
Cette réponse fortement traite de la La norme IEEE-754 Double précision en virgule flottante au format, illustrée ici:
La façon dont fonctionne la solution est qu'il crée une union entre un 64-bit nombre à virgule flottante et un entier non signé entier 16 bits de tableau en little endian octet de commande. Après la validation de l'entier de la gamme d'entrée, il jette de l'entrée d'une virgule flottante double précision numéro de la mémoire tampon, puis utilise l'union pour gagner peu accès à la valeur et calculer la chaîne binaire basée sur la neutralité binaire de l'exposant et de la fraction bits.
La solution est mise en oeuvre dans le plus pur ECMAScript 5, sauf pour l'utilisation de
String#padStart()
, qui a disponible polyfill ici.-(2**53)-1
à2**53-1
au lieu de simplement-(2**31)
à2**31-1
comme annan réponse.TypedArrays
comme un syndicat afin de faire de manipulation de bits sans avoir à forcer le nombre de 32 bits.x=5; if(x>0) prepend="0"; else prepend=""; alert(prepend+((x>>>0)).toString(2).toString());
vs Annan solution?toString()
est complètement inutile, et en ajoutant un seul0
semble faire plus de mal que de bien. Le seul "avantage" est, je pense, qu'il met en lumière les valeurs entre2**31
et2**32-1
comme positif en ajoutant un0
(fabrication de leurs chaînes de bits différents des valeurs entre-(2**32)
et-(2**31)
), mais rend la bitstring 33 octets au lieu de 32 dans ces cas, ce qui peut causer des problèmes si les consommateurs du code assumer le max possible la longueur est de 32.Vous pouvez utiliser
Nombre.toString(2)
fonction, mais il a quelques problèmes de représentation des nombres négatifs. Par exemple,(-1).toString(2)
de sortie est"-1"
.Pour résoudre ce problème, vous pouvez utiliser le décalage à droite non signé au niveau du bit opérateur (
>>>
) de forcer votre numéro à un entier non signé.Si vous exécutez
(-1 >>> 0).toString(2)
vous permettra de changer votre numéro 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 va afficher"11111111111111111111111111111111"
correctement.Cette question a plus d'explications.
Note 1: cette réponse s'attend à un Nombre comme argument, afin de le convertir en conséquence.
Note 2: le résultat est une chaîne de sans zéros, donc appliquer rembourrage que vous en avez besoin.
>>>
signifie? Je n'ai jamais vu avant(-3>>>0).toString(2);
imprime11111101
qui est de -3 en 2s compléter.javascript:alert((-3>>>0).toString(2));
<-- dans la barre d'adresse11111111111111111111111111111101
sur Firefox et Chrome. Pourquoi?-3 >>> 0 (right logical shift) coerces its arguments to unsigned integers, which is why you get the 32-bit two's complement representation of -3.
Il explique d'ailleurs très peu et en fait, 2s complément est SIGNÉ, donc, pour dire que vous obtenez un entier non signé est vraiment pas clair.x=536870912; if(x>0) prepend="0"; else prepend=""; alert(prepend+((x>>>0)).toString(2).toString());
je l'ai mentionné dans ma réponse, qui obtient le résultat correct >>>x >>> 0
fait la même chose que~x
;~x
est pas binaire,x >>> 0
est un bitshift opérateur à 0 les bits vers la droite. Dans ce cas, il suffit de forcer le nombre non signé de 32 bits entier...Essayer
Le 2 est la base et peut être n'importe quelle base entre 2 et 36
source ici
Mise à JOUR:
Cela ne fonctionne que pour les nombres positifs, Javascript représente négatif binaire des entiers en complément à deux sur la notation. J'ai fait cette petite fonction qui devrait faire l'affaire, je n'ai pas testé correctement:
J'ai eu de l'aide de ici
-3
retourne1
). Aussi je croisdec > 0
devrait êtredec >= 0
, qui devrait au moins fix 0. Parce quedec2Bin(0)
retourne10
.Le binaire dans 'convertir en binaire" peut désigner trois choses principales. La position de numéro de système, la représentation binaire en mémoire des chaînes de bits ou 32 bits. (pour des chaînes de bits 64 bits voir Patrick Roberts répondre)
1. Système De Numéro De
(123456).toString(2)
permettra de convertir les nombres en base 2 système de numération positionnel. Dans ce système, les nombres négatifs sont écrit avec le signe moins, tout comme dans le système décimal.2. La Représentation Interne
La représentation interne des nombres est 64 bits à virgule flottante et certaines limites sont discutées dans cette réponse. Il est pas de moyen facile de créer un peu de chaîne de la représentation de la ce en javascript, ni accès à des bits.
3. Masques & Opérateurs au niveau du Bit
MDN a un bonne vue d'ensemble de la façon dont les opérateurs sur les bits de travail. Important:
Avant les opérations sont appliquées 64 bit floating points les nombres sont exprimés à 32 bits entiers signés. Après ils sont reconvertis.
Voici le MDN exemple de code pour la conversion des numéros en 32 bits chaînes.
x=536870912; if(x>0) prepend="0"; else prepend=""; alert(prepend+((x>>>0)).toString(2).toString());
-2.25 (decimal)
devient-10.01 (binary)
. J'ai fait un lien vers l'article de wikipedia qui explique de façon adéquate de position des systèmes de nombres. Aucune infraction, mais je vais annuler vos modifications comme plusieurs sont mieux laisser aux commentaires. Si il y a quelque chose que vous voulez me readd s'il vous plaît dire.Un moyen simple est juste...
(42).toString(2)
42..toString(2)
42..toString(2)
et il n'y a probablement pas de conversion de int int Nombre(42) 42 est un entier de toute façon donc il est probable laisse comme il est. Deuxièmement, la chose vous dire que les gens sont aux prises avec (convertir une chaîne en un entier), les gens ne sont pas et ce n'est pas dans cette question, et ce que vous gardez amener que des nouvelles pour vous, est un1.
qui est le même que1.0
ou tout simplement1
(et, de même, vous pouvez aussi omettre la partie avant et à écrire.5
au lieu de0.5
). Ainsi, dans l'exemple, le premier point est le séparateur décimal qui est en partie le nombre et le deuxième point est le point de l'opérateur pour l'appel de la méthode sur ce nombre. Vous devez utiliser deux points (ou enveloppez-le nombre entre parenthèses) et ne peut pas simplement écrire42.toString(2)
car le parseur voit le point comme séparateur décimal et renvoie une erreur parce qu'il manque un opérateur point.Remarque - la base
(x>>>0).toString(2);
a un léger problème quand x est positif. J'ai un exemple de code à la fin de ma réponse qui résout ce problème avec le >>> mode tout en utilisant >>>.Un exemple de travail
Présent dans la barre d'URL est une autre preuve rapide
Note - Le résultat est très légèrement imparfait, en ce qu'elle commence toujours avec un " 1 pour les nombres négatifs est très bien. Pour les nombres positifs, vous devez ajouter un 0 au début de sorte que le résultat est vraiment 2s compléter. Donc
(8>>>0).toString(2)
produit 1000 qui n'est vraiment pas 8 en 2s compléter, mais en ajoutant que 0, la rendant 01000, est correcte 8 en 2s compléter. En bon 2s complément, toute chaîne de bits à partir de 0 >=0, et toute chaîne de bits à partir de 1, est négatif.par exemple, cette contourne le problème
Les autres solutions sont l'un de Annan(si Annan explications et les définitions sont pleines de fautes, il a du code qui génère le droit de sortie), et la solution de Patrick.
Quelqu'un qui ne comprend pas le fait de positif numéros commençant par 0 et les nombres négatifs avec 1, en 2s complément, puisse vérifier ce DONC QnA sur 2s compléter. Qu'est-ce que “Complément de 2”?
Vous pouvez écrire votre propre fonction qui retourne un tableau de bits.
Exemple, comment convertir le nombre de bits
Diviseur| Dividende| bits/reste
2 | 9 | 1
2 | 4 | 0
2 | 2 | 0
~ | 1 |~
exemple de la ligne ci-dessus: 2 * 4 = 8 et le reste est 1
donc 9 = 1 0 0 1
Lire les restes du bas vers le haut. Chiffre 1 dans le milieu de la page.
Math.floor(number%2)
au lieu denumber = Math.floor(number/2)
?C'est mon code:
C'est la solution . Son très simple, comme une question de fait