Comment convertir un entier en binaire en JavaScript?
j'aimerais voir des nombres entiers, positifs ou négatifs, en binaire.
un peu comme cette question , mais pour JavaScript.
9 réponses
cette réponse tente d'adresser des entiers avec des valeurs absolues entre Number.MAX_SAFE_INTEGER
(ou 2**53-1
) et 2**31
. Les solutions actuelles ne traitent que les entiers signés en 32 bits, mais cette solution affichera en complément de 64 bits deux sous la forme float64ToInt64Binary()
:
// IIFE to scope internal variables
var float64ToInt64Binary = (function () {
// create union
var flt64 = new Float64Array(1)
var uint16 = new Uint16Array(flt64.buffer)
// 2**53-1
var MAX_SAFE = 9007199254740991
// 2**31
var MAX_INT32 = 2147483648
function uint16ToBinary() {
var bin64 = ''
// generate padded binary string a word at a time
for (var word = 0; word < 4; word++) {
bin64 = uint16[word].toString(2).padStart(16, 0) + bin64
}
return bin64
}
return function float64ToInt64Binary(number) {
// NaN would pass through Math.abs(number) > MAX_SAFE
if (!(Math.abs(number) <= MAX_SAFE)) {
throw new RangeError('Absolute value must be less than 2**53')
}
var sign = number < 0 ? 1 : 0
// shortcut using other answer for sufficiently small range
if (Math.abs(number) <= MAX_INT32) {
return (number >>> 0).toString(2).padStart(64, sign)
}
// little endian byte ordering
flt64[0] = number
// subtract bias from exponent bits
var exponent = ((uint16[3] & 0x7FF0) >> 4) - 1023
// encode implicit leading bit of mantissa
uint16[3] |= 0x10
// clear exponent and sign bit
uint16[3] &= 0x1F
// check sign bit
if (sign === 1) {
// apply two's complement
uint16[0] ^= 0xFFFF
uint16[1] ^= 0xFFFF
uint16[2] ^= 0xFFFF
uint16[3] ^= 0xFFFF
// propagate carry bit
for (var word = 0; word < 3 && uint16[word] === 0xFFFF; word++) {
// apply integer overflow
uint16[word] = 0
}
// complete increment
uint16[word]++
}
// only keep integer part of mantissa
var bin64 = uint16ToBinary().substr(11, Math.max(exponent, 0))
// sign-extend binary string
return bin64.padStart(64, sign)
}
})()
console.log('8')
console.log(float64ToInt64Binary(8))
console.log('-8')
console.log(float64ToInt64Binary(-8))
console.log('2**33-1')
console.log(float64ToInt64Binary(2**33-1))
console.log('-(2**33-1)')
console.log(float64ToInt64Binary(-(2**33-1)))
console.log('2**53-1')
console.log(float64ToInt64Binary(2**53-1))
console.log('-(2**53-1)')
console.log(float64ToInt64Binary(-(2**53-1)))
console.log('2**52')
console.log(float64ToInt64Binary(2**52))
console.log('-(2**52)')
console.log(float64ToInt64Binary(-(2**52)))
.as-console-wrapper {
max-height: 100% !important;
}
Cette réponse fortement traite de la IEEE-754 Double précision en virgule flottante au format , illustré ici:
seee eeee eeee ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff
---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
[ uint16[3] ] [ uint16[2] ] [ uint16[1] ] [ uint16[0] ]
[ flt64[0] ]
little endian byte ordering
s = sign = uint16[3] >> 15
e = exponent = (uint16[3] & 0x7FF) >> 4
f = fraction
la façon dont la solution fonctionne est qu'elle crée une union entre un nombre flottant de 64 bits et un tableau entier de 16 bits non signé dans l'ordre des octets de little endian. Après avoir validé la gamme entière d'entrée, il envoie l'entrée à un nombre flottant de double précision sur le tampon, puis utilise l'union pour gagner l'accès bit à la valeur et calculer la chaîne binaire basée sur le binaire non biaisé bits exposant et fraction.
la solution est implémentée en ECMAScript 5 pur, sauf pour l'utilisation de String#padStart()
, qui a un polyfill disponible ici .
Réponse :
function dec2bin(dec){
return (dec >>> 0).toString(2);
}
dec2bin(1); // 1
dec2bin(-1); // 11111111111111111111111111111111
dec2bin(256); // 100000000
dec2bin(-256); // 11111111111111111111111100000000
vous pouvez utiliser Number.toString(2)
fonction, mais il a quelques problèmes quand la représentation des nombres négatifs. Par exemple, la sortie (-1).toString(2)
est "-1"
.
pour corriger ce problème, vous pouvez utiliser l'opérateur bitwise de poste de droite non signé( >>>
) pour forcer votre numéro à un entier non signé.
si vous exécutez (-1 >>> 0).toString(2)
vous déplacerez votre nombre 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 affichera "11111111111111111111111111111111"
correctement.
Cette question a plus d'explications.
-3 >>> 0
(déplacement logique de droite) coerces ses arguments à des entiers non signés, c'est pourquoi vous obtenez le 32-bit la représentation du complément de two est de -3.
Note 1 : cette réponse attend un nombre comme argument, donc le convertir en conséquence.
Note 2 : le résultat est la chaîne a sans zéros de tête, donc appliquer le rembourrage que vous avez besoin.
Essayer
num.toString(2);
le 2 est le radix et peut être n'importe quelle base entre 2 et 36
source ici
mise à jour:
cela ne fonctionnera que pour les nombres positifs, Javascript représente les entiers binaires négatifs dans la notation du complément de deux. J'ai fait cette petite fonction qui devrait faire l'affaire, je n'ai pas testé 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 /q/javascript-decimal-to-binary-64-bit-59754/"https://stackoverflow.com/questions/4338315/javascript-inverting-a-binary-value-of-a-number" rel="nofollow noreferrer"> ici
Le binaire dans 'convertir en binaire" peut désigner trois choses principales. Le système de nombre de position, la représentation binaire en mémoire ou les cordons de bits 32bit. (pour 64 bits voir réponse de Patrick Roberts )
1. Système De Numérotation
(123456).toString(2)
convertira les nombres en base 2 système numérique de position . Dans ce système, les nombres négatifs sont écrits avec moins des signes comme en décimal.
2. 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 y a no easy way pour créer une représentation en chaîne de bits dans javascript ou accéder à des bits spécifiques.
3. Masques Et Bit-À-Bit Opérateurs
MDN a un bon aperçu de la façon dont les opérateurs bitwise travailler. Important:
les opérateurs Bitwise traitent leurs opérandes comme une séquence de 32 bits (zéros et uns)
avant l'application des opérations les nombres à points flottants de 64 bits sont lancés sur des entiers signés de 32 bits. Après ils sont reconvertis.
Voici le code D'exemple 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"
une manière simple est juste...
Number(42).toString(2);
// "101010"
Note-le (x>>>0).toString(2);
de base présente un léger problème lorsque x est positif. J'ai un exemple de code à la fin de ma réponse qui résout ce problème avec le >>> méthode tout en utilisant >>>.
(-3>>>0).toString(2);
prints -3 in 2s complement.
1111111111101
exemple pratique
C:\>type n1.js
console.log( (-3 >>> 0).toString(2) );
C:\>
C:\>node n1.js
11111111111111111111111111111101
C:\>
ceci dans la barre D'URL est une autre preuve rapide
javascript:alert((-3>>>0).toString(2))
Note-le résultat est très légèrement défectueux, en ce qu'il commence toujours par un 1, qui pour les nombres négatifs est fin. Pour les nombres positifs, vous devez préparer un 0 Au début pour que le résultat soit vraiment un complément 2s. Donc (8>>>0).toString(2)
produit 1000 qui n'est pas vraiment 8 en complément 2s, mais en préparant ce 0, ce qui fait 01000, est correct 8 en complément 2s. Dans le complément 2S approprié, toute chaîne de bits commençant par 0 est >=0, et toute chaîne de bits commençant par 1 est négative.
, par exemple, cette contourne le problème
// or x=-5 whatever number you want to view in binary
x=5;
if(x>0) prepend="0"; else prepend="";
alert(prepend+((x>>>0)).toString(2));
les autres solutions sont les suivantes: un de Annan (bien que les explications et les définitions DE Annan sont pleines d'erreurs, il a le code qui produit la bonne sortie), et la solution de Patrick.
N'importe qui qui ne comprend pas le fait des nombres positifs commençant par 0 et des nombres négatifs avec 1, dans le complément 2s, pourrait vérifier cela ainsi QnA sur le complément 2s. Qu'est-ce que"le complément de 2"?
Vous pouvez écrire votre propre fonction qui retourne 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 la ligne ci-dessus: 2 * 4 = 8 et le reste est 1 so 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.
C'est mon code:
var x = prompt("enter number", "7");
var i = 0;
var binaryvar = " ";
function add(n) {
if (n == 0) {
binaryvar = "0" + binaryvar;
}
else {
binaryvar = "1" + binaryvar;
}
}
function binary() {
while (i < 1) {
if (x == 1) {
add(1);
document.write(binaryvar);
break;
}
else {
if (x % 2 == 0) {
x = x / 2;
add(0);
}
else {
x = (x - 1) / 2;
add(1);
}
}
}
}
binary();
C'est la solution . C'est assez simple comme une question de fait
function binaries(num1){
var str = num1.toString(2)
return(console.log('The binary form of ' + num1 + ' is: ' + str))
}
binaries(3
)
/*
According to MDN, Number.prototype.toString() overrides
Object.prototype.toString() with the useful distinction that you can
pass in a single integer argument. This argument is an optional radix,
numbers 2 to 36 allowed.So in the example above, we’re passing in 2 to
get a string representation of the binary for the base 10 number 100,
i.e. 1100100.
*/