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 réelle dont la logique peut être mise en œuvre par n'importe quel langage de programmation :
Si vous êtes sûr que c'est uniquement positif :
var a = 0;
var n = 12; // your input
var m = 1;
while(n) {
a = a + n%2*m;
n = Math.floor(n/2);
m = m*10;
}
console.log(n, ':', a) // 12 : 1100
S'il peut être négatif ou positif -
(n >>> 0).toString(2)
J'aimerais voir les nombres entiers, positifs ou négatifs, en binaire.
Il s'agit d'une vieille question et je pense qu'il y a de très bonnes solutions ici, mais il n'y a pas d'explication sur l'utilisation de ces solutions intelligentes.
Tout d'abord, nous devons comprendre qu'un nombre peut être positif ou négatif. De plus, JavaScript fournit une fonction MAX_SAFE_INTEGER
qui a une valeur de 9007199254740991
. Ce chiffre s'explique par le fait que JavaScript utilise virgule flottante à double précision formatent les nombres comme spécifié dans IEEE 754 et ne peut représenter en toute sécurité que des nombres entiers compris entre -(2^53 - 1)
y 2^53 - 1
.
Nous connaissons donc maintenant la plage dans laquelle les nombres sont "sûrs". De plus, JavaScript ES6 dispose de la méthode intégrée Number.isSafeInteger()
pour vérifier si un nombre est un entier sûr.
Logiquement, si l'on veut représenter un nombre n
En binaire, ce nombre a besoin d'une longueur de 53 bits, mais pour une meilleure présentation, utilisons 7 groupes de 8 bits = 56 bits et remplissons le côté gauche avec 0
o 1
sur la base de son signe en utilisant le padStart
fonction.
Ensuite, nous devons gérer les nombres positifs et négatifs : les nombres positifs s'additionneront 0
vers la gauche, tandis que les nombres négatifs ajouteront 1
s. De même, les nombres négatifs devront être représentés par un complément à deux. Nous pouvons facilement y remédier en ajoutant Number.MAX_SAFE_INTEGER + 1
au numéro.
Par exemple, nous voulons représenter -3
comme binaire, supposons que Number.MAX_SAFE_INTEGER
est 00000000 11111111
(255)
puis Number.MAX_SAFE_INTEGER + 1
sera 00000001 00000000
(256)
. Ajoutons maintenant le nombre Number.MAX_SAFE_INTEGER + 1 - 3
ce sera 00000000 11111101
(253)
mais comme nous l'avons dit, nous remplirons le côté gauche avec 1
comme ceci 11111111 11111101
(-3)
, ce qui représente -3
en binaire.
Un autre algorithme consistera à ajouter 1
au nombre et inverser le signe comme suit -(-3 + 1) = 2
ce sera 00000000 00000010
(2)
. Maintenant, nous inversons chaque bit comme suit 11111111 11111101
(-3)
nous avons à nouveau une représentation binaire de -3
.
Nous avons ici un extrait fonctionnel de ces algos :
function dec2binA(n) {
if (!Number.isSafeInteger(n)) throw new TypeError('n value must be a safe integer')
if (n > 2**31) throw 'number too large. number should not be greater than 2**31'
if (n < -1*(2**31)) throw 'number too far negative, number should not be lesser than 2**31'
const bin = n < 0 ? Number.MAX_SAFE_INTEGER + 1 + n : n
const signBit = n < 0 ? '1' : '0'
return parseInt(bin, 10).toString(2)
.padStart(56, signBit)
.replace(/\B(?=(.{8})+(?!.))/g, ' ')
}
function dec2binB(n) {
if (!Number.isSafeInteger(n)) throw new TypeError('n value must be a safe integer')
if (n > 2**31) throw 'number too large. number should not be greater than 2**31'
if (n < -1*(2**31)) throw 'number too far negative, number should not be lesser than 2**31'
const bin = n < 0 ? -(1 + n) : n
const signBit = n < 0 ? '1' : '0'
return parseInt(bin, 10).toString(2)
.replace(/[01]/g, d => +!+d)
.padStart(56, signBit)
.replace(/\B(?=(.{8})+(?!.))/g, ' ')
}
const a = -805306368
console.log(a)
console.log('dec2binA:', dec2binA(a))
console.log('dec2binB:', dec2binB(a))
const b = -3
console.log(b)
console.log('dec2binA:', dec2binA(b))
console.log('dec2binB:', dec2binB(b))
Une autre alternative
const decToBin = dec => {
let bin = '';
let f = false;
while (!f) {
bin = bin + (dec % 2);
dec = Math.trunc(dec / 2);
if (dec === 0 ) f = true;
}
return bin.split("").reverse().join("");
}
console.log(decToBin(0));
console.log(decToBin(1));
console.log(decToBin(2));
console.log(decToBin(3));
console.log(decToBin(4));
console.log(decToBin(5));
console.log(decToBin(6));
J'ai utilisé une approche différente pour parvenir à ce résultat. J'ai décidé de ne pas utiliser ce code dans mon projet, mais j'ai pensé le laisser quelque part au cas où il serait utile à quelqu'un.
Il contient également la version "inverse" de la fonction qui reconvertit les bits en int. Vous en aurez besoin car il n'y a probablement rien d'autre qui puisse interpréter cette sortie :D
function intToBitString(input, size, unsigned) { if ([8, 16, 32].indexOf(size) == -1) { throw "invalid params"; } var min = unsigned ? 0 : - (2 size / 2); var limit = unsigned ? 2 size : 2 ** size / 2; if (!Number.isInteger(input) || input < min || input >= limit) { throw "out of range or not an int"; } if (!unsigned) { input += limit; } var binary = input.toString(2).replace(/^-/, ''); return binary.padStart(size, '0'); }
function bitStringToInt(input, size, unsigned) { if ([8, 16, 32].indexOf(size) == -1) { throw "invalid params"; } input = parseInt(input, 2); if (!unsigned) { input -= 2 ** size / 2; } return input; }
// EXAMPLES
var res; console.log("(uint8)10"); res = intToBitString(10, 8, true); console.log("intToBitString(res, 8, true)"); console.log(res); console.log("reverse:", bitStringToInt(res, 8, true)); console.log("---");
console.log("(uint8)127"); res = intToBitString(127, 8, true); console.log("intToBitString(res, 8, true)"); console.log(res); console.log("reverse:", bitStringToInt(res, 8, true)); console.log("---");
console.log("(int8)127"); res = intToBitString(127, 8, false); console.log("intToBitString(res, 8, false)"); console.log(res); console.log("reverse:", bitStringToInt(res, 8, false)); console.log("---");
console.log("(int8)-128"); res = intToBitString(-128, 8, false); console.log("intToBitString(res, 8, true)"); console.log(res); console.log("reverse:", bitStringToInt(res, 8, true)); console.log("---");
console.log("(uint16)5000"); res = intToBitString(5000, 16, true); console.log("intToBitString(res, 16, true)"); console.log(res); console.log("reverse:", bitStringToInt(res, 16, true)); console.log("---");
console.log("(uint32)5000"); res = intToBitString(5000, 32, true); console.log("intToBitString(res, 32, true)"); console.log(res); console.log("reverse:", bitStringToInt(res, 32, true)); console.log("---");
Voici la méthode que j'utilise. C'est une méthode très rapide et concise qui fonctionne pour les nombres entiers.
Si vous le souhaitez, cette méthode fonctionne également avec les BigInts. Il suffit de modifier chaque 1
a 1n
.
// Assuming {num} is a whole number
function toBin(num){
let str = "";
do {
str = `${num & 1}${str}`;
num >>= 1;
} while(num);
return str
}
Cette méthode passe en quelque sorte par tous les bits du nombre comme s'il s'agissait déjà d'un nombre binaire.
Il commence par une chaîne vide, puis ajoute la dernière partie. num & 1
renvoie le dernier bit du nombre ( 1
o 0
). num >>= 1
supprime alors le dernier bit et fait de l'avant-dernier bit le nouveau dernier bit. Le processus est répété jusqu'à ce que tous les bits aient été lus.
Bien sûr, il s'agit d'une simplification extrême de ce qui se passe réellement. Mais c'est ainsi que je le généralise.
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 !