J'aimerais voir les nombres entiers, positifs ou négatifs, en binaire.
Plutôt comme cette question mais pour JavaScript.
J'aimerais voir les nombres entiers, positifs ou négatifs, en binaire.
Plutôt comme cette question mais pour JavaScript.
function dec2bin(dec) {
return (dec >>> 0).toString(2);
}
console.log(dec2bin(1)); // 1
console.log(dec2bin(-1)); // 11111111111111111111111111111111
console.log(dec2bin(256)); // 100000000
console.log(dec2bin(-256)); // 11111111111111111111111100000000
Vous pouvez utiliser Number.toString(2)
mais elle pose quelques problèmes lorsqu'elle représente des nombres négatifs. Par exemple, (-1).toString(2)
Le résultat est "-1"
.
Pour résoudre ce problème, vous pouvez utiliser l'opérateur bitwise de décalage à droite non signé ( >>>
) pour forcer votre nombre à devenir un entier non signé.
Si vous exécutez (-1 >>> 0).toString(2)
vous décalez 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 donnera "11111111111111111111111111111111"
correctement.
Cette question fournit de plus amples explications.
-3 >>> 0
(décalage logique à droite) transforme ses arguments en entiers non signés, ce qui explique la représentation de -3 en complément à deux sur 32 bits.
Cela fait un moment que je n'ai pas essayé le javascript mais j'essaie ici w3schools.com/js/tryit.asp?filename=tryjs_output_alert avec ceci <script> window.alert((-3 >>> 0).toString(2)) ; </script>ouais ça a marché
ToString(2) ne fonctionne pas parce que vous obtenez l'entrée à partir d'un texte. Utilisez ceci : function decToBase(dec, base){ return parseInt(dec).toString(base) ; } alert(decToBase(dec, 2)) ;
Essayer
num.toString(2);
Le 2 est le radix et peut être n'importe quelle base entre 2 et 36.
source ici
UPDATE :
Cela ne fonctionne que pour les nombres positifs, Javascript représente les nombres entiers binaires négatifs en notation à deux compléments. J'ai créé cette petite fonction qui devrait faire l'affaire, mais je ne l'ai pas encore testée correctement :
function dec2Bin(dec)
{
if(dec >= 0) {
return dec.toString(2);
}
else {
/* Here you could represent the number in 2s compliment but this is not what
JS uses as its not sure how many bits are in your number range. There are
some suggestions https://stackoverflow.com/questions/10936600/javascript-decimal-to-binary-64-bit
*/
return (~dec).toString(2);
}
}
J'ai reçu l'aide de ici
La mise à jour ne semble toujours pas fonctionner pour les nombres négatifs ( -3
retours 1
). Je pense également que dec > 0
devrait être dec >= 0
qui devrait au moins fixer 0. Parce que dec2Bin(0)
retours 10
.
Les deux cas cités dans les commentaires ci-dessus renvoient un résultat correct dans ma console chrome - var a = -1 ; a.toString(2) ; "-1" var a = -3 ; a.toString(2) ; "-11"
Les gens se débattent avec cela. La réponse est correcte parce qu'elle transforme l'entrée (42) en un entier et que cette ligne est nécessaire. Si vous obtenez votre "nombre" à partir d'une entrée texte, la fonction toString(2) ne fonctionnera pas.
Le terme "binaire" dans l'expression "convertir en binaire" peut se référer à trois choses principales. Le système des nombres positionnels, la représentation binaire en mémoire ou les chaînes de bits de 32 bits. (pour les chaînes de bits de 64 bits, voir Réponse de Patrick Roberts )
1. Le système des nombres
(123456).toString(2)
convertira les nombres en base 2 système de numération positionnelle . Dans ce système, les nombres négatifs s'écrivent avec le signe moins, comme dans le système décimal.
2. Représentation interne
La représentation interne des nombres est 64 bits à virgule flottante et certaines limitations sont discutées dans cette réponse . Il y a pas de solution de facilité pour créer une représentation sous forme de chaîne de bits en javascript et accéder à des bits spécifiques.
3. Masques et opérateurs bitwise
MDN dispose d'une bonne vue d'ensemble sur le fonctionnement des opérateurs bitwise. Il est important de noter que
Les opérateurs bitwise traitent leurs opérandes comme une séquence de 32 bits (zéros et uns)
Avant que les opérations ne soient appliquées, les nombres à virgule flottante de 64 bits sont convertis en nombres entiers signés de 32 bits. Ils sont ensuite reconvertis.
Voici l'exemple de code MDN pour convertir des nombres en chaînes de 32 bits.
function createBinaryString (nMask) {
// nMask must be between -2147483648 and 2147483647
for (var nFlag = 0, nShifted = nMask, sMask = ""; nFlag < 32;
nFlag++, sMask += String(nShifted >>> 31), nShifted <<= 1);
return sMask;
}
createBinaryString(0) //-> "00000000000000000000000000000000"
createBinaryString(123) //-> "00000000000000000000000001111011"
createBinaryString(-1) //-> "11111111111111111111111111111111"
createBinaryString(-1123456) //-> "11111111111011101101101110000000"
createBinaryString(0x7fffffff) //-> "01111111111111111111111111111111"
@Magus Je pense avoir suffisamment expliqué les différences entre les chiffres et les chaînes binaires. Une chaîne binaire de 32 bits est toujours composée de trente-deux caractères comprenant des "1" et des "0". toString renvoie une valeur de réel nombre représenté à l'aide des systèmes de numération de position avec la base donnée. Il dépend pourquoi vous voulez la chaîne, elles ont des significations très différentes.
Cette réponse tente de traiter les entrées dont la valeur absolue se situe dans la plage 2147483648 10 (2 31 ) - 9007199254740991 10 (2 53 -1).
En JavaScript, les nombres sont stockés dans Représentation en virgule flottante de 64 bits mais les opérations par bit les convertissent en nombres entiers de 32 bits en format complément à deux Par conséquent, toute approche utilisant des opérations par bit limite la plage de sortie à -2147483648. 10 (-2 31 ) - 2147483647 10 (2 31 -1).
Toutefois, si l'on évite les opérations par bit et que l'on préserve la représentation en virgule flottante de 64 bits en utilisant uniquement des opérations mathématiques, on peut convertir de manière fiable n'importe quelle nombre entier sûr en notation binaire à deux compléments de 64 bits en étendant le signe de la notation binaire de 53 bits. twosComplement
:
function toBinary (value) {
if (!Number.isSafeInteger(value)) {
throw new TypeError('value must be a safe integer');
}
const negative = value < 0;
const twosComplement = negative ? Number.MAX_SAFE_INTEGER + value + 1 : value;
const signExtend = negative ? '1' : '0';
return twosComplement.toString(2).padStart(53, '0').padStart(64, signExtend);
}
function format (value) {
console.log(value.toString().padStart(64));
console.log(value.toString(2).padStart(64));
console.log(toBinary(value));
}
format(8);
format(-8);
format(2**33-1);
format(-(2**33-1));
format(2**53-1);
format(-(2**53-1));
format(2**52);
format(-(2**52));
format(2**52+1);
format(-(2**52+1));
.as-console-wrapper{max-height:100%!important}
Pour les navigateurs plus anciens, il existe des polyfills pour les fonctions et valeurs suivantes :
En outre, vous pouvez prendre en charge n'importe quel radix (2-36) si vous effectuez la conversion en complément à deux pour les nombres négatifs dans 64 / log 2 (radix) en utilisant BigInt
:
function toRadix (value, radix) {
if (!Number.isSafeInteger(value)) {
throw new TypeError('value must be a safe integer');
}
const digits = Math.ceil(64 / Math.log2(radix));
const twosComplement = value < 0
? BigInt(radix) ** BigInt(digits) + BigInt(value)
: value;
return twosComplement.toString(radix).padStart(digits, '0');
}
console.log(toRadix(0xcba9876543210, 2));
console.log(toRadix(-0xcba9876543210, 2));
console.log(toRadix(0xcba9876543210, 16));
console.log(toRadix(-0xcba9876543210, 16));
console.log(toRadix(0x1032547698bac, 2));
console.log(toRadix(-0x1032547698bac, 2));
console.log(toRadix(0x1032547698bac, 16));
console.log(toRadix(-0x1032547698bac, 16));
.as-console-wrapper{max-height:100%!important}
Si vous êtes intéressé par mon ancienne réponse qui utilisait un ArrayBuffer
pour créer une union entre un Float64Array
et un Uint16Array
, veuillez vous référer à la réponse historique des révisions .
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
3 votes
Les exemples a.toString(2) ne semblent pas fonctionner pour -1
1 votes
Il est également possible de convertir les données binaires en données décimales : stackoverflow.com/questions/11103487/
0 votes
Et quand j'ai dit "en binaire", c'est peut-être un peu ambigu. Je parle de la représentation interne de la chaîne de bits, qui est le complément à 2, de sorte que les nombres positifs seraient en base 2, avec un 0 en tête (et les nombres négatifs ne seraient pas écrits avec un symbole moins ou avec une représentation de la magnitude du signe, mais comme une fonction de leur équivalent positif).
0 votes
-1. Cette question est incroyablement trompeuse. "Peut-être un peu ambiguë" est un euphémisme. Pourquoi le complément 2s n'apparaît-il ni dans le titre ni dans le corps de la question, si c'est ce que vous voulez en fait ? Il en va de même pour une expression plus ou moins équivalente telle que "internal bit-string-representation". D'après votre réponse et vos commentaires sur d'autres réponses, j'en conclus que vous ne vous intéressez pas au binaire mais plutôt au complément à 2s. Les questions que vous critiquez me semblent répondre aux questions suivantes exactement votre question... Ce ne sont pas les réponses qui sont mauvaises, c'est votre question qui l'est.
0 votes
@dingalapadum Réfléchissez-y. De combien de façons différentes (en pratique) les ordinateurs représentent-ils les entiers positifs et négatifs ? Il y a la méthode de la magnitude du signe, le complément à 1s et le complément à 2s. Et il y a "une méthode personnalisée". Si quelqu'un veut montrer une méthode, il doit indiquer le nom de la représentation. Si quelqu'un écrit "-1101", ce n'est pas binaire. Car le signe moins n'est pas un chiffre binaire. Si quelqu'un dit que 1 est "1" et que -1 est "11111", quelle est la façon mécanique de les distinguer ? Quel est le nom de ce système ?
0 votes
Lorsque l'on parle de représentation des nombres en "x-aire", on veut dire que l'on utilise x chiffres pour représenter le ampleur du numéro. Le signe du nombre n'est pas un chiffre et n'est pas utilisé pour la magnitude. Le signe ne change pas non plus la magnitude du nombre. Votre question porte sur la manière d'encoder les nombres dans une chaîne binaire. Dans le commentaire, vous dites déjà que vous vous intéressez au complément à 2. Alors, pourquoi ne pas l'indiquer dans le titre ou dans la question elle-même, afin d'éviter d'induire les gens en erreur, d'éviter cette discussion, de rendre la question plus claire et de meilleure qualité dans l'ensemble ?
0 votes
@dingalapadum Vous ne faites que lancer d'autres faux-fuyants, par exemple, vous écrivez, comme une sorte d'argument pour moi, que "1011 peut être compris comme un nombre binaire" (comme si cela était censé être une nouvelle ou que j'avais suggéré le contraire).
0 votes
J'ai écrit "-1011" et non "1011". Les nombres négatifs semblent être votre problème avec les "mauvaises" réponses, n'est-ce pas ? Quoi qu'il en soit. L'IMO est une question de très mauvaise qualité en l'état et il serait très simple de l'améliorer. J'essayais juste d'expliquer pourquoi je pense cela. Les "mauvaises" réponses et vos propres commentaires le confirment. Par ailleurs, vous n'avez toujours pas expliqué pourquoi il est préférable de ne pas mentionner le complément à 2 dans le titre ou le corps de la question. Demander "comment convertir en binaire" mais exiger en fait le complément à 2s comme réponse est (selon vos propres termes) ambiguë . Pourquoi ne pas préciser la question ?
0 votes
Laissez-nous poursuivre cette discussion dans le chat .
0 votes
Qu'est-ce que le zéro négatif en binaire en javascript ? Il ne peut être qu'en complément à 1 ? Il est généralement représenté par tous les 1 binaires. - > 111111111.... sans savoir combien. Cette référence présente la représentation binaire du nombre 32 bits de -0 sous la forme d'un 1 suivi de 31 zéros. - fr.wikipedia.org/wiki/Signed_zero
0 votes
@JoePythonKing Que voulez-vous dire par " Il ne peut être qu'en complément à 1 ? " Vous êtes du Royaume-Uni, alors peut-être pouvez-vous mieux écrire en anglais. Vous pouvez chercher -1 en complément à 1s ou -1 en complément à 2s. Les ordinateurs ont tendance à utiliser le complément à 2s plutôt que le complément à 1s, mais le passage de l'un à l'autre n'est pas un mystère. Il existe d'autres représentations. En ce qui concerne le nombre de 1 pour les nombres négatifs, par exemple en complément à 2, cela n'a pas d'importance et n'en aurait probablement pas non plus pour le complément à 1. Cela dépend du nombre de bits dont vous disposez pour stocker le nombre !