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.
Une solution que je choisirais et qui convient pour 32 bits est le code à la fin de cette réponse, qui provient de developer.mozilla.org(MDN), mais avec quelques lignes ajoutées pour A) le formatage et B) la vérification que le nombre est dans l'intervalle.
Certains ont suggéré x.toString(2)
qui ne fonctionne pas pour les négatifs, il leur colle un signe moins, ce qui n'est pas bon.
Fernando a mentionné une solution simple de (x>>>0).toString(2);
ce qui convient pour les négatifs, mais pose un léger problème lorsque x est positif. La sortie commence par 1, ce qui, pour les nombres positifs, n'est pas un complément à 2 correct.
Quiconque ne comprend pas le fait que les nombres positifs commencent par 0 et les nombres négatifs par 1, en complément à 2, peut consulter ce QnA SO sur le complément à 2. Qu'est-ce que le "complément à 2" ?
Une solution pourrait consister à faire précéder les nombres positifs d'un 0, ce que j'ai fait dans une précédente révision de cette réponse. Et on pourrait accepter d'avoir parfois un nombre de 33 bits, ou on pourrait s'assurer que le nombre à convertir est compris dans l'intervalle -(2^31)<=x<2^31-1. Ainsi, le nombre est toujours de 32 bits. Mais plutôt que de faire cela, vous pouvez opter pour cette solution sur mozilla.org
La réponse et le code de Patrick sont longs et fonctionnent apparemment pour le 64-bit, mais il y avait un bug qu'un commentateur a trouvé, et le commentateur a corrigé le bug de patrick, mais patrick a un certain "nombre magique" dans son code qu'il n'a pas commenté et qu'il a oublié, et patrick ne comprend plus complètement son propre code / pourquoi il fonctionne.
M. Annan a utilisé une terminologie incorrecte et peu claire, mais il a mentionné une solution proposée par developer.mozilla.org.
Note : l'ancien lien https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators est maintenant redirigé ailleurs et n'a pas ce contenu, mais l'ancien lien, qui apparaît lorsque archive.org récupère les pages, est disponible ici. https://web.archive.org/web/20150315015832/https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators
La solution proposée fonctionne pour les nombres de 32 bits.
Le code est assez compact, une fonction de trois lignes.
Mais j'ai ajouté une regex pour formater la sortie en groupes de 8 bits. Basé sur Comment formater un nombre avec des virgules comme séparateurs de milliers ? (Je l'ai juste modifié après l'avoir regroupé dans la rubrique 3s de droite à gauche et en ajoutant virgules , au regroupement en 8s de droite à gauche, et en ajoutant espaces )
Et, bien que Mozilla ait fait un commentaire sur la taille de nMask (le nombre introduit) qu'il doit être dans l'intervalle, ils n'ont pas testé ou lancé une erreur quand le nombre est hors de l'intervalle, donc j'ai ajouté cela.
Je ne sais pas trop pourquoi ils ont appelé leur paramètre "nMask", mais je le laisserai tel quel.
function createBinaryString(nMask) {
// nMask must be between -2147483648 and 2147483647
if (nMask > 2**31-1)
throw "number too large. number shouldn't be > 2**31-1"; //added
if (nMask < -1*(2**31))
throw "number too far negative, number shouldn't be < -(2**31)" //added
for (var nFlag = 0, nShifted = nMask, sMask = ''; nFlag < 32;
nFlag++, sMask += String(nShifted >>> 31), nShifted <<= 1);
sMask=sMask.replace(/\B(?=(.{8})+(?!.))/g, " ") // added
return sMask;
}
console.log(createBinaryString(-1)) // "11111111 11111111 11111111 11111111"
console.log(createBinaryString(1024)) // "00000000 00000000 00000100 00000000"
console.log(createBinaryString(-2)) // "11111111 11111111 11111111 11111110"
console.log(createBinaryString(-1024)) // "11111111 11111111 11111100 00000000"
//added further console.log example
console.log(createBinaryString(2**31 -1)) //"01111111 11111111 11111111 11111111"
Vous pouvez écrire votre propre fonction qui renvoie un tableau de bits. Exemple de conversion d'un nombre en bits
Exemple de la ligne ci-dessus : 2 * 4 = 8 et le reste est 1 donc 9 = 1 0 0 1
function numToBit(num){
var number = num
var result = []
while(number >= 1 ){
result.unshift(Math.floor(number%2))
number = number/2
}
return result
}
Lire les restes de bas en haut. Chiffre 1 du milieu vers le haut.
Voici comment je m'en sors :
const decbin = nbr => {
if(nbr < 0){
nbr = 0xFFFFFFFF + nbr + 1
}
return parseInt(nbr, 10).toString(2)
};
Je l'ai obtenu à partir de ce lien : https://locutus.io/php/math/decbin/
Nous pouvons également calculer le binaire pour des nombres positifs ou négatifs comme ci-dessous :
function toBinary(n){
let binary = "";
if (n < 0) {
n = n >>> 0;
}
while(Math.ceil(n/2) > 0){
binary = n%2 + binary;
n = Math.floor(n/2);
}
return binary;
}
console.log(toBinary(7));
console.log(toBinary(-7));
Vous pouvez utiliser une solution récursive :
function intToBinary(number, res = "") {
if (number < 1)
if (res === "") return "0"
else
return res
else return intToBinary(Math.floor(number / 2), number % 2 + res)
}
console.log(intToBinary(12))
console.log(intToBinary(546))
console.log(intToBinary(0))
console.log(intToBinary(125))
Ne fonctionne qu'avec des nombres positifs.
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 !