Javascript에서 이진수를 나타내는 "0b"또는 이와 유사한 것이 있습니까?


130

0xJavascript에서 16 진수의 접두사 라는 것을 알고 있습니다. 예를 들어 0xFF숫자 255를 나타냅니다.

이진수와 비슷한 것이 있습니까? 나는 0b1111숫자를 나타낼 것으로 예상 15되지만 이것은 효과가 없습니다.


1
호기심에서 : 왜 자바 스크립트에서 이진 리터럴이 필요할까요? Javascript의 높은 수준의 특성은 일반적으로 이진 리터럴이 필요한 낮은 수준의 구문과 상호 작용할 필요가 없음을 의미합니다.
Joachim Sauer

19
이 방법으로 코드를 더 읽기 쉽게 할 수 있습니다. 내 구현은 이진수를 사용하는 일부 사양을 기반으로합니다.
Misha Moroshko

5
로봇에 대한 노드 JS를 사용하여 이진이 요구 될 수있다의 좋은 예이다
그렉 우즈

가독성을 높이기 위해 숫자 구분 기호 를 사용 하는 것이 좋습니다. 0b0111_0_1_0_1.
Константин Ван

답변:


181

최신 정보:

최신 버전의 JavaScript, 특히 ECMAScript 6은 이진 (prefix 0b), 8 진 (prefix 0o) 및 16 진 (prefix 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

이 기능은 Firefox 및 Chrome에서 이미 사용할 수 있습니다. 현재는 IE에서 지원되지 않지만 스파르탄이 도착했을 때입니다.

( 세미콜론 의 의견과 이것을 지적한 것에 대한 소망의 답변 에 감사드립니다 .)

원래 답변 :

아니요, 이진수에 해당하는 것이 없습니다. JavaScript는 10 진수 (접두사 없음), 16 진수 (prefix 0x) 및 8 진수 (prefix 0) 형식의 숫자 리터럴 만 지원합니다 .

가능한 대안 중 하나 parseInt는 기수와 함께 이진 문자열을 메소드 에 전달하는 것입니다 .

var foo = parseInt('1111', 2);    // foo will be set to 15

2
@MishaMoroshko 동의하지만 0b지원할 언어는 거의 없습니다 .
Alba Mendez

5
기술적으로 JavaScript는 8 진 표기법을 제공하지 않지만 대부분의 브라우저는 지원합니다. 엄격 모드에서는 명시 적으로 허용되지 않습니다.
Deebster

5
JavaScript에서 내부적으로 모든 숫자는 64 비트 부동 소수점이며 정수와 같은 것은 없습니다. 따라서 숫자가 클수록 정확도가 떨어집니다. 가장 정확한 "정수"는 2 ^ 53 또는 9007199254740992입니다.
zupa

5
정수는 수학 용어이므로 정수가 없으므로 int typenor integer type가 없으므로 모든 정수는 부동 소수점으로 저장됩니다.
퍼킨스

3
이 답변은 당시에는 사실이지만 업데이트를 사용할 수 있습니다. 아래의 답변에서 요점을 지적한 것처럼 이진수 및 8 진수의 리터럴 (8 진수는 "0o1"로 표시됨)은 ES6에 있습니다. 그들은 이미 Firefox, Chrome 및 심지어 새로운 IE (Spartan)의 미리보기에 착륙했습니다.
세미콜론

29

ECMASCript 6에서 이것은 언어의 일부로 지원 될 것 0b1111 === 15입니다. 대문자 B를 사용할 수도 있습니다 (예 :) 0B1111.

ES6 SpecNumericLiterals 에서 찾으십시오 .


23

나는 사람들이 프로토 타입을 확장하는 것은 좋은 생각이 아니라 당신의 대본이라고 말합니다.

나는 이것을 이렇게한다 :

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

3
이것은 멋지다! 8-) ParseInt("101", 2)실제 답변이 될 수 있습니다!
Alexis Wilke

20

코딩이 아닌 디스플레이가 주요 관심사 인 경우 사용할 수있는 내장 변환 시스템이 있습니다.

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

참조 : JavaScript 숫자 참조


11

내가 아는 한 Javascript에는 이진 표시기를 사용할 수 없습니다. 나는 당신을 위해 세 가지 해결책을 가지고 있으며, 모두 해결책이 있습니다. 대안 3이 가독성에있어 가장 "좋아 보인다"고 생각합니다. 초기 런타임 비용을 제외하고는 나머지 것보다 훨씬 빠릅니다. 문제는 최대 255 개의 값만 지원한다는 것입니다.

대안 1 : "00001111".b()

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

대안 2 : b("00001111")

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

대안 3 : b00001111

이 버전에서는 8 자리 이진수 b00000000, 4 자리 b0000및 가변 숫자 를 입력 할 수 있습니다 b0. 즉 b01불법, 당신은 사용해야 b0001하거나 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;

6

이것이 유용 할 수 있습니다.

var bin = 1111;
var dec = parseInt(bin, 2);
// 15

10
조금 이상하면 귀엽습니다. 그러나 그것은 당신을위한 JavaScript입니다. bin이진수로 보이는 숫자가 할당되었지만 실제로는 10 진법으로 구문 분석되고 있습니다.이 parseInt함수는 문자열을 첫 번째 인수로 예상하므로 "1111"(기본 10 표현)으로 바꾼 다음 다시 구문 분석합니다. 그것은 기본 2.했다
테드 Hopp

2

아니요. 그러나 parseInt를 사용하고 선택적으로 따옴표를 생략 할 수 있습니다.

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

따옴표를 생략하는 유일한 단점은 매우 큰 숫자의 경우 오버플로가 더 빠르다는 것입니다.

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

1

이진 문자열을 숫자로 변환하거나 그 반대로 변환하십시오.

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

-1

나는 이것이 실제로 여러 번 대답 된 질문에 대답하지는 않는다는 것을 알고 있습니다. 방법은 16 진수 표현을 사용하는 것입니다.

Q의 문구에서 코드에 이진 리터럴을 사용하는 것에 대해서만 이야기하고 숫자 값의 이진 표현을 처리하지는 않는 것 같습니다 (parstInt가 갈 길입니다).

0-F에서 0000-1111 로의 맵핑에 익숙하지 않은 2 진 숫자를 처리해야하는 많은 프로그래머가 있는지 의심합니다. 기본적으로 4 개의 그룹을 만들고 16 진 표기법을 사용하십시오.

따라서 101000000010을 쓰는 대신 0xA02를 사용합니다. 0xA02는 정확히 같은 의미를 가지며 훨씬 더 읽기 쉽고 오류가 적습니다.

가독성을 고려하고
10001000000010010 또는 1001000000010010 중 더 큰 것을 비교해보십시오

내가 다음과 같이 쓰면 어떻게
될까요 : 0x11012 또는 0x9012


-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; }
}

parseInt (두 번째 매개 변수없이)는 이진 문자열을 다시 기본 10 숫자로 변환합니다! 예를 들어 0b100 (4)는 100이되고 경고에 의해 문자열로 되돌아갑니다!
Tom
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.