[자바스크립트] 2비트 논리 계산기로 비트 연산자와 toString()메서드 공부하기

KangHyeYoon·2022년 5월 15일
0
post-thumbnail

0과 1의 세계로

컴퓨터는 0과 1밖에 모른다. 단 두 개의 값이지만, 바이너리(binary) 연산의 세계는 무궁무진하다. 2비트 계산기를 만들어 보자. 다음은 기본적인 선행지식이다 :

  • 자바스크립트의 원시 값 중 숫자는 항상 부동소수점 방식만을 따른다.
  • 자바스트립트의 변수(메모리)는 64비트 형식으로 저장된다.
let x = 5; // 0000000000000000000000000000000000000000000000101

비트 연산자

& (AND)

대응하는 비트가 모두 1이어야만 1을 반환

const x = 5;     // 00000101
const y = 3;     // 00000011
console.log(x & y);	// 00000001
// 출력 : 1

| (OR)

대응하는 비트 중 하나라도 1이면 1을 반환

const x = 5;        // 00000101
const y = 3;        // 00000011

console.log(x | y); // 00000111
// 출력 : 7

^ (XOR)

대응하는 비트가 서로 다른 값을 가질 때에만 1을 반환

const x = 5;        // 00000101
const y = 3;        // 00000011

console.log(x ^ y); // 00000110
// 출력 : 6

이 외에도 다양한 논리 연산과 연산자가 있지만, 이번에 만들 2비트 계산기는 가장 기본적인 연산인 ANDOR, XOR 연산만을 사용하겠다.

비트 연산자를 활용한 계산기

사용자로부터 10진수 숫자를 받아 비트 연산을 수행하고 다시 10진수 숫자로 반환한다.

// AND
const bitwiseAND = (n1, n2) => n1 & n2;
// OR
const bitwiseOR = (n1, n2) => n1 | n2;
// XOR
const bitwiseXOR = (n1, n2) => n1 ^ n2;

Number.prototype.toString()

특정 진수로 객체를 표현한 문자열을 반환한다.

Number 객체는 Object 객체의 toString() 메서드를 오버라이딩하기 때문에 Object.prototype.toString() 를 상속받지 않으며 단순한 문자열 변환이 아닌 진수 변환을 가능하게 한다.

인수로 radix(진수를 나타내는 기수 값, 2~36)를 넘겨 진수를 변환할 수 있다.
10진수를 다른 진수로 변환할 때 주로 이 메서드를 사용한다.

// 10진수 -> 2진수
const dec = 2309;
dec.toString(2);   // 100100000101

참고로 다른 진수를 10진수로 변환할 때에는 parseInt()를 사용한다.

const bin = "1111011";
parseInt(bin, 2); // "123"

toString(2)를 활용한 계산기

// AND
const bitwiseAND = (n1, n2) => parseInt((n1 & n2).toString(2),2)
// OR
const bitwiseOR = (n1, n2) => parseInt((n1 | n2).toString(2),2)
// XOR
const bitwiseXOR = (n1, n2) => parseInt((n1 ^ n2).toString(2),2)

사실 단순한 비트 연산에는 toString 메서드나 parseInt 메서드를 사용하지 않아도 되지만, 두 메서드를 사용하면 자바스크립트 십진수의 이진 표현이나 이진수의 십진 표현을 확인할 수 있기 때문에 관련 내용을 작성하였다.

profile
사람 입장에서 생각하는 컴퓨터입니다.

0개의 댓글