자바스크립트 핵심컨샙33(+ES6) #12. 비트 연산자, 형식화 배열, 버퍼(배열)

김동욱·2021년 10월 3일
0

자바스크립트

목록 보기
12/25
post-thumbnail

비트 연산자(bitwise operator)는 인수를 32비트 정수로 변환하여 이진 연산을 수행합니다.
이런 비트 조작 관련 연산자는 자바스크립트뿐만 아니라 대부분의 프로그래밍 언어에서 지원합니다.
아래는 비트 연산 시 쓰이는 연산자 목록입니다.

  • 비트 AND ( & )
  • 비트 OR ( | )
  • 비트 XOR ( ^ )
  • 비트 NOT ( ~ )
  • 왼쪽 시프트(LEFT SHIFT) ( << )
  • 오른쪽 시프트(RIGHT SHIFT) ( >> )
  • 부호 없는 오른쪽 시프트(ZERO-FILL RIGHT SHIFT) ( >>> )

    비트 연산자는 저수준(2진 표현)에서 숫자를 다뤄야 할 때 쓰이므로 솔직히 웹개발(자바스크립트)에서는 흔하게 쓰이진 않습니다.(ㄱㅇㄷ)


1. 비트 연산자

const a = 5;        // 00000000000000000000000000000101
const b = 3;        // 00000000000000000000000000000011

console.log(a & b); // 00000000000000000000000000000001
//AND 비트 연산자(&)는 두 개의 피연산자의 각 자리마다 대응하는 비트가 모두 1일 경우 1을 반환합니다.
console.log(a | b); // 00000000000000000000000000000111
//비트 OR 연산자는 대응되는 두 비트 중 하나라도 1이면 1을 반환하며, 두 비트가 모두 0일 때만 0을 반환합니다.
console.log(a ^ b); // 00000000000000000000000000000000
//비트 XOR 연산자는 대응되는 두 비트가 서로 다르면 1을 반환하고, 서로 같으면 0을 반환합니다.
console.log(~a); // 11111111111111111111111111111010
//비트 << 연산자는 정해준 숫자만큼 숫자를 왼쪽으로 밀어버립니다.
console.log(a << 2) // 00000000000000000000000000010100
//비트 >> 연산자는 정해준 숫자만큼 숫자를 오른쪽으로 밀어버립니다.
console.log(a >> 2) // 00000000000000000000000000000001

비트연산을 시작하면 피연산자는 32비트 정수로 변환되며 일련의 비트(0과 1)로 표현됩니다. 32비트 이상인 숫자는 최상위 비트가 삭제됩니다. 예를 들어 32비트 이상인 다음 정수는 32비트 정수로 변환됩니다.

AND 비트 연산자(&)는 두 개의 피연산자의 각 자리마다 대응하는 비트가 모두 1일 경우 1을 반환합니다.

  1. 맨 뒷자리의 숫자는 둘다 1이니까 1을 출력
  2. 맨 뒷자리의 2번째 숫자는 하나만 1이니까 0을 출력
  3. 맨 뒷자리의 3번째 숫자는 하나만 1이니까 0을 출력

즉 숫자 하나하나를 비교하면서 연산을 하고 그 결과로 새로운 2진수로 변환합니다.
여기서 보면 일반적인 연산자랑 똑같은 규칙으로 연산되는걸 알 수 있습니다.


2. 형식화 배열(ES6)

자바스크립트의 형식화 배열(Typed Array)은 일반적인 배열(Array)와 몇 가지 차이가 있는 유사 배열 객체입니다. 형식화 배열 객체의 특징은 다음과 같습니다.

  • 형식화 배열의 원소는 모두 숫자다.
  • 생성자에 숫자의 타입과 크기를 사용해 형식화 배열을 생성한다.
  • 형식화 배열은 크기가 고정된다.
  • 배열이 생성된 시점에 형식화 배열의 원소들은 항상 0으로 초기화 된다.

마치 java의 배열과 흡사하다

다음은 배열의 종류입니다.

  • Int8Array() -128 ~ 127 부호 있는 8비트 정수
  • Uint8Array() 0 ~ 255 부호 없는 8비트 정수
  • Int16Array() -32,768 ~ 32,767 부호 있는 16비트 정수
  • Uint16Array() 0 ~ 65,535 부호 없는 16비트 정수
  • Int32Array() -2,147,483,648 ~ 2,147,483,647 부호 있는 32비트 정수
  • Uint32Array() 0 ~ 4,294,967,295 부호 없는 32비트 정수
  • Float32Array() -3.4 x 10^38 ~ 3.4 x 10^38 32비트 부동 소수점 값 (실수)
  • Float64Array() -1.79 x 10^308 ~ 1.79 x 10^308 64비트 부동 소수점 값 (실수)
let arr = [1,2,3]
let overArr = [-129, 128]
let a = new Int8Array(1, 2, 3)

console.log(a) //Uint8Array(1) [ 0 ] // 그냥 Array처럼 넣으면 안되고 배열로 넣어야 함

let b = new Int8Array(arr)

console.log(b)//Int8Array(3) [ 1, 2, 3 ]

let c = new Int8Array(overArr) // 만약 정해진 숫자를 넘겨버리면 배열의 최댓값 or 최솟값에서 넘겨져버린 숫자만큼 줄어든다

console.log(c)//Int8Array(2) [ 127, -128 ]

형식화 베열을 생성할 때는 생성자에 배열의 크기를 전달하거나 배열 또는 타입 배열을 전달해 원소를 초기화 합니다.
형식화 배열을 사용하면 일반 배열에 비하여 실행 시간과 메모리 사용 측면에서 효율적일 수 있습니다.


3. 버퍼(배열)

var buffer = new ArrayBuffer(8);

console.log(buffer)
//ArrayBuffer {
//  [Uint8Contents]: <00 00 00 00 00 00 00 00>,
//  byteLength: 8
//}

버퍼는 길이가 정해져 있는 이진 데이터를 저장하며 데이터 부분을 나타냅니다.
형식화 배열의 버퍼를 생성하는 방법은 아래와 같으며 생성자의 매개변수는 버퍼의 바이트 크기다.
(여기서부터 컴퓨터 공학 지식이 들어가는거가따 슬슬 무슨말인지 모르게따)

profile
안녕하세요. 부산에서 근무하고 있는 프론트엔드 개발자 김동욱입니다. 영어 공부 겸 개발 공부를 위해서 글을 작성하고있습니다.

0개의 댓글