컴퓨터는 0과 1밖에 모른다. 단 두 개의 값이지만, 바이너리(binary) 연산의 세계는 무궁무진하다. 2비트 계산기를 만들어 보자. 다음은 기본적인 선행지식이다 :
숫자
는 항상 부동소수점 방식만을 따른다.let x = 5; // 0000000000000000000000000000000000000000000000101
대응하는 비트가 모두 1이어야만 1을 반환
const x = 5; // 00000101
const y = 3; // 00000011
console.log(x & y); // 00000001
// 출력 : 1
대응하는 비트 중 하나라도 1이면 1을 반환
const x = 5; // 00000101
const y = 3; // 00000011
console.log(x | y); // 00000111
// 출력 : 7
대응하는 비트가 서로 다른 값을 가질 때에만 1을 반환
const x = 5; // 00000101
const y = 3; // 00000011
console.log(x ^ y); // 00000110
// 출력 : 6
이 외에도 다양한 논리 연산과 연산자가 있지만, 이번에 만들 2비트 계산기
는 가장 기본적인 연산인 AND
와 OR
, 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 객체는 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"
// 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 메서드를 사용하지 않아도 되지만, 두 메서드를 사용하면 자바스크립트 십진수의 이진 표현이나 이진수의 십진 표현을 확인할 수 있기 때문에 관련 내용을 작성하였다.