¿Hay "0b" o algo similar para representar un número binario en Javascript

130

Sé que 0xes un prefijo para números hexadecimales en Javascript. Por ejemplo, 0xFFrepresenta el número 255.

¿Hay algo similar para los números binarios? Esperaría 0b1111representar el número 15, pero esto no funciona para mí.

Misha Moroshko
fuente
1
Por curiosidad: ¿Por qué necesitarías literales binarios en Javascript? La naturaleza de alto nivel de Javascript significa que generalmente no necesita interactuar con construcciones de bajo nivel que requerirían literales binarios.
Joachim Sauer
19
Porque de esta manera el código será más legible. Mi implementación se basa en alguna especificación que usa números binarios.
Misha Moroshko
55
usar el nodo js para la robótica es un buen ejemplo de dónde se puede requerir binario
Greg Woods
Puede considerar el uso de separadores numéricos para una mejor legibilidad. 0b0111_0_1_0_1.
Константин Ван

Respuestas:

181

Actualizar:

Las versiones más recientes de JavaScript, específicamente ECMAScript 6, han agregado soporte para literales numéricos binarios (prefijo 0b), octales (prefijo 0o) y hexadecimales (prefijo 0x:):

var bin = 0b1111;    // bin will be set to 15
var oct = 0o17;      // oct will be set to 15
var oxx = 017;       // oxx will be set to 15
var hex = 0xF;       // hex will be set to 15
// note: bB oO xX are all valid

Esta característica ya está disponible en Firefox y Chrome. Actualmente no es compatible con IE, pero aparentemente lo será cuando llegue Spartan.

(Gracias a Punto y coma comentario 's y la respuesta de Urish por señalar esto.)

Respuesta original

No, no hay un equivalente para números binarios. JavaScript solo admite literales numéricos en formatos decimal (sin prefijo), hexadecimal (prefijo 0x) y octal (prefijo 0).

Una alternativa posible es pasar una cadena binaria al parseIntmétodo junto con la raíz:

var foo = parseInt('1111', 2);    // foo will be set to 15
LukeH
fuente
2
@MishaMoroshko Estoy de acuerdo, pero pocos idiomas tienen 0bsoporte.
Alba Mendez
55
Técnicamente, JavaScript no presenta notación octal, aunque la mayoría (¿todos?) Los navegadores lo admiten. Está explícitamente prohibido en modo estricto.
Deebster
55
Tenga en cuenta que internamente en JavaScript, cada número es un flotante de 64 bits, no existe un número entero. Por lo tanto, con grandes números, pierde precisión. El mayor "entero" exacto es 2 ^ 53, o 9007199254740992.
zupa
55
Hay enteros, ya que entero es un término matemático, no hay int typeni integer type, por lo que todos los enteros se almacenan como flotantes.
Perkins
3
Esta respuesta era cierta en ese momento, pero podría usar una actualización. Como urish señala en su respuesta a continuación, los literales para números binarios y octales (los octales ahora se escriben "0o1") están en ES6. Ya han aterrizado en Firefox, Chrome e incluso en la vista previa del nuevo IE (Spartan).
Punto
29

En ECMASCript 6, esto se admitirá como parte del lenguaje, 0b1111 === 15es decir, es cierto. También puede usar una B mayúscula (por ejemplo 0B1111).

Busque NumericLiteralsen la especificación ES6 .

urish
fuente
23

Sé que la gente dice que extender los prototipos no es una buena idea, pero ha sido tu guión ...

Lo hago de esta manera:

Object.defineProperty(Number.prototype, 'b', {set:function(){return false;},get:function(){return parseInt(this, 2);}});

100..b       // returns 4
11111111..b  // returns 511
10..b+1      // returns 3

// and so on
Juan garcia
fuente
3
¡Esto es genial! 8-) Tenga en cuenta que ParseInt("101", 2)podría ser la respuesta real!
Alexis Wilke
20

Si su principal preocupación es la visualización en lugar de la codificación, hay un sistema de conversión incorporado que puede usar:

var num = 255;
document.writeln(num.toString(16)); // Outputs: "ff"
document.writeln(num.toString(8)); // Outputs: "377"
document.writeln(num.toString(2)); // Outputs: "11111111"

Ref: Referencia de número de JavaScript

Estallidos
fuente
11

Hasta donde yo sé, no es posible usar un denoter binario en Javascript. Tengo tres soluciones para usted, todas las cuales tienen sus problemas. Creo que la alternativa 3 es la más "atractiva" para la legibilidad, y posiblemente sea mucho más rápida que el resto, excepto por su costo inicial de tiempo de ejecución. El problema es que solo admite valores de hasta 255.

Alternativa 1: "00001111".b()

String.prototype.b = function() { return parseInt(this,2); }

Alternativa 2: b("00001111")

function b(i) { if(typeof i=='string') return parseInt(i,2); throw "Expects string"; }

Alternativa 3: b00001111

Esta versión le permite escribir binarios de 8 dígitos b00000000, 4 dígitos b0000y dígitos variables b0. Eso es b01ilegal, tienes que usar b0001o b1.

String.prototype.lpad = function(padString, length) {
    var str = this;
    while (str.length < length)
        str = padString + str;
    return str;
}
for(var i = 0; i < 256; i++)
    window['b' + i.toString(2)] = window['b' + i.toString(2).lpad('0', 8)] = window['b' + i.toString(2).lpad('0', 4)] = i;
frodeborli
fuente
6

Puede ser esto útil:

var bin = 1111;
var dec = parseInt(bin, 2);
// 15
Sergey Metlov
fuente
10
Lindo, aunque un poco raro. Pero eso es JavaScript para ti. binse le asigna un número que parece que está en binario, pero en realidad se está analizando en base 10. La parseIntfunción espera una cadena como primer argumento, por lo que la convierte en "1111" (representación en base 10), luego la vuelve a analizar como si era base 2.
Ted Hopp
2

No, pero puede usar parseInt y, opcionalmente, omitir las comillas.

parseInt(110, 2); // this is 6 
parseInt("110", 2); // this is also 6

La única desventaja de omitir las comillas es que, para números muy grandes, se desbordará más rápido:

parseInt(10000000000000000000000, 2); // this gives 1
parseInt("10000000000000000000000", 2); // this gives 4194304
usuario1213898
fuente
1

Convierta cadenas binarias a números y viceversa.

var b = function(n) {
    if(typeof n === 'string')
        return parseInt(n, 2);
    else if (typeof n === 'number')
        return n.toString(2);
    throw "unknown input";
};
jpillora
fuente
-1

Sé que esto realmente no responde la pregunta Q (que ya fue respondida varias veces) como es, sin embargo, sugiero que usted (u otras personas interesadas en este tema) consideren el hecho de que es más legible y compatible con el navegador sería usar la representación hexadecimal.

De la redacción de la Q parecería que solo está hablando de usar literales binarios en su código y no procesar representaciones binarias de valores numéricos (para lo cual parstInt es el camino a seguir).

Dudo que haya muchos programadores que necesiten manejar números binarios que no estén familiarizados con el mapeo de 0-F afont>1111. básicamente, haga grupos de cuatro y use notación hexadecimal.

entonces, en lugar de escribir 101000000010, usaría 0xA02, que tiene exactamente el mismo significado y es mucho más legible y tiene menos probabilidades de tener errores.

Solo considere la legibilidad, intente comparar cuál de ellos es más grande:
10001000000010010 o 1001000000010010

y si los escribo así:
0x11012 o 0x9012

epeleg
fuente
-3
// Conversion function
function bin(nb)
{
    return parseInt(nb.toString(2));
}

// Test
var stop = false;
while(!stop)
{
    var n = parseInt(prompt("Type a decimal number : "));
    alert(bin(n));

    var str = prompt("Retry ? Y / N");
    if(str === "N") { stop = true; }
}
Asesino de Ilusiones
fuente
¡parseInt (sin segundo parámetro) convierte la cadena binaria de nuevo en un número base 10! por ejemplo, 0b100 (4) se convierte en 100 y luego se vuelve a convertir en una cadena mediante alerta.
Tom