Bit Mask에 대해 알아보자

우빈·2024년 5월 7일
1
post-thumbnail

Bit Mask

  • 비트(0과 1)를 마스킹(비트 연산)하는 방법으로 중요한 정보를 표현하는 것
  • 16명 학생에 대한 출석을
absent = [7, 10, 12]

로 표현하지 않고,

b’11110101 10111111’

다음과 같이 이진수로 표현하는 것.

표현해보기

모든 원소 포함하기

A = -1

-1을 이진수로 표현하면, 16비트(+부호비트 1비트)기준 10000000000000001이 된다.
이를 2의 보수로 취하면 01111111111111111이 되기 때문에,
-1로 표현 후 2의 보수를 취하면 쉽게 모든 원소를 포함시킬 수 있다.

특정 원소 삭제하기

i+1번째 원소를 삭제하려면 다음과 같은 식을 사용하면 된다.

num & ~(1<<i)

아ㅜ 머리아프니까 이진수로 생각해보자.
5를 이진수로 한 0101이 있는데, 내가 여기서 왼쪽에서 세번째 1을 지워서 0001로 만들고 싶다고 가정하고 손컴파일을 해보자.

n = 3 - 1 # 지우고싶은 자리, -1한 이유는 i+1번째기때문
0101 & ~(1<<n)
->
0101 & ~(1<<2)
->
0101 & ~(0100)
->
0101 & 1011
->
0001

와개쩐다

원리를 알아보자면, 지우고 싶은 데이터를 1<<n을 사용해서 지정을 하고(0100), 그 데이터를 1의 보수를 취해서 논리곱을 취한다.

풀어 말하자면 논리곱은 두 항이 다 1이어야 1이 되기 때문에, 0100을 보수 취해서 1011, 즉 다른 데이터는 다 살려놓되 지우고싶은 데이터만 0으로 처리하여 죽이는 원리이다.

진짜 만든사람 천잰가.?

특정 원소 포함시키기

num | (1<<i)

대충 느낌은 오는데 '대충'이란 말은 조은 말은 아니니. 손컴파일 해보쟈.

n = 2 - 1 # 0111로 만들고 싶음.
0101 | (1<<n)
->
0101 | (1<<1)
->
0101 | 0010
->
0111

원리 설명을 하자면, 포함시키고 싶은 데이터를 체크(0010) 후, 이를 논리합 연산해서 더하는 원리이다. 따로 보수를 취할 필요는 없고 포함시키고 싶은 데이터만 1, 나머지는 0으로 처리하면 논리합 특성에 따라서 자동으로 해당 데이터가 포함되는 원리.

특정 원소 토글시키기

num ^ (1<<i)

아니 XOR 왜쓰냐고 으악으악!!!!!이라고 할라했는데 대충 예상이 가는 것 같기도
11, 00은 false고 01이나 10은 true니까 특정 원소에 1을 넣는다고 가정했을 때 XOR하면
무조건 토글이 되는게 아닐까

0일 경우 false였음 -> 0이랑 1이랑 XOR -> true
1일 경우 true였음 -> 1이랑 1이랑 XOR -> false
미쳤다 손컴파일을 해보자

n = 2 - 1 # 0110을 0100로 만들어보자
0110 ^ (1<<n)
->
0110 ^ 0010
->
0100

예측 성공!!!!

마지막 원소 삭제

num & (num-1)
->
0101 & 0100
->
0100

원리 설명없이 이건 간단하게 1을 빼고 그거랑 논리곱해서 삭제하는 연산.

또 다른 방법

비트시프트 두번하면 될것같다 ~~~!!!

num >> 1 << 1
->
0101
->
0010
->
0100

또머잇지 NOR쓰면 될것같은데
1이랑 nor하면 마지막 원소는 무조건 0이 될테니

(num ~| 1) # 이런 연산자 엄나 ㅜ
->
(0101 ~| 0001)
->
(1010) ? 이상해짐

생각을 잘못한 것 같다 NOR은 0,0이면 true가 반환돼서,,, NAND쓰는건 어떨까

(num ~& 1) # 있는 연산자라고 가정하고...
->
(0101 ~& 0001)
->
(0100) 오 정답

좋은 생각이여쓰

마지막 원소 얻기 (0을 제외한 제일 끝 원소)

num & -num
->
0101 & 1011
->
0001

0110 & 1010
->
0010
와 신기하다

아하 2의보수 취하면 1의 보수를 취하고 더하는거니 이론상 1을 만났을 때 바뀌므로 2의 보수 취한 것과 논리곱하면 마지막만 얻을 수 있따

profile
프론트엔드 공부중

0개의 댓글