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.

213
demandé sur Xufox 2012-03-30 12:50:55

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:

IEEE-754 Double-precision floating-point format

   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 .

9
répondu Patrick Roberts 2017-08-18 18:05:31

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.

339
répondu fernandosavio 2018-09-19 21:22:59

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     

162
répondu Manatok 2017-05-23 11:47:32

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"
41
répondu Annan 2017-07-25 02:58:38

une manière simple est juste...

Number(42).toString(2);

// "101010"
36
répondu ad rees 2013-11-24 21:38:39

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"?

8
répondu barlop 2017-07-26 12:35:50

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.

6
répondu supritshah1289 2016-11-02 22:36:13

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();
-2
répondu Vincent William Rodriguez 2017-11-07 12:28:26

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.
        */
-3
répondu Brian 2018-06-12 07:59:07