개발새발 로그

[자바스크립트] 비트 연산 Bit operation (비트 마스크) 본문

알고리즘

[자바스크립트] 비트 연산 Bit operation (비트 마스크)

이즈흐 2023. 6. 7. 14:49

비트연산자

2진수단위로 논리 연산을 위해 사용하는 연산자입니다.

 

비트연산자의 종류

AND 연산자

a & b : 대응하는 비트가 모두 1일 때 1을 반환

1 & 3;

// 1 & 3 = 1

OR 연산자

a | b : 대응되는 비트 중 하나라도 1이면 1을 반환

1 | 3

// 1 | 3 = 3

XOR 연산자

a ^ b : 대응되는 비트가 서로 다르면 1을 반환한다.

1 ^ 3

// 1 ^ 3 = 2

NOT 연산자

~a : 0이면 1로, 1이면 0으로 반전시킨다.

~1

// ~1 == ...1110

LEFT SHIFT 연산

a<<b : a를 b비트만큼 왼쪽으로 이동, 이동 후 빈자리는 0으로 채운다.

1 << 3

// 1000(2)

RIGHT SHIFT 연산

a>>b : a를 b비트만큼 오른쪽으로 이동, 오른쪽으로 밀려난 만큼 범위를 벗어난 데이터는 잘려나감

9 >> 2

// 0000 0010(2)

LOGICAL RIGHT SHIFT 연산

a>>>b : 음,양을 구분하는 사인비트를 염두에 두지 않고 비트를 오른쪽으로 시프트하는 연산

 

비트연산자 활용(비트마스크)

GET BIT

i번째 인덱스의 비트가 1인지 0인지 판단

funtion getBit(num,i){
	let answer = false;
    
    let mask = 1 << i;
    
    if(num & mask) answer=true;
    
    return answer;
}

console.log(getBtit(9,3));

//1001
//1000
//----
//1000 true

 

SET BIT

i번쟤 인덱스를 1로 셋팅

function setBit(num,i){
	//num과 mask를 or연산을 비교
    
    return num | (1<<i)
}
console.log(setBit(5,3));

//0101
//1000
//----
//1101

CLEAR BIT

i번째 인덱스를 0으로 초기화

function clearBit(num,i){
	//mask를 i번째 인덱스는 0, 나머지는 1로 세팅
    //1<<i = 1000, ~(i<<i) = 0111
    
    return num & ~(1<<i);
}

console.log(clearBit(9,3));

//1001
//0111
//----
//0001

CLEAR LEFT BIT

인덱스 기준 오른편은 1, 왼편은 0으로 초기화

function clearLeftBits(num,i){
	//mask : 1000(2)-1 -> 0111
    
    return num & (1<<i)-1
}

console.log(clearLeftBits(169,3));

//...10101001
//...00000111
//-----------
//...00000001

CLEAR RIGHT BIT

i번째 인덱스 포함 오른편만 0으로 초기화

function clearRightBIts(num,i){
	//mask -1<<(i+1) : ...11110000
    return num & (-1<<(i+1));
}

console.log(clearrightBits(169,3));

//...10101001
//...11110000
//-----------
//...10100000

UPDATE BIT

i번째 인덱스의 값을 1 or 0으로 업데이트

function updateBit(num,i,bool){
	return (num& ~(-1<<i)) | ((bool? 1 : 0) << i);
}
console.log(updateBit(169,3,false))

//...10101001
//...11110111
//-----------&
//...10100001
//...00000000
//-----------|
//...10100001

 

 

 

출처

https://www.youtube.com/watch?v=yHBYeguDR0A&t=1133s 

 

728x90
반응형
LIST