Computer Science/Algorithms

bitmasking

metamong 2022. 12. 20.

* intro>

๐Ÿ’ง bitmask = '์ปดํ“จํ„ฐ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋ชจ๋“  ์ž๋ฃŒ๋ฅผ ์ด์ง„์ˆ˜๋กœ ํ‘œํ˜„. ์ด ํŠน์„ฑ์„ ์ด์šฉํ•ด ์ •์ˆ˜์˜ ์ด์ง„์ˆ˜ ํ‘œํ˜„์„ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ์“ฐ๋Š” ๊ธฐ๋ฒ•'

(์—„๋ฐ€ํ•˜๊ฒŒ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ์•„๋‹˜)

 

๐Ÿ’ง 2์ง„์ˆ˜ ๊ด€๋ จ bit ์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•˜๋ฉด ์›ฌ๋งŒํ•œ ๋ชจ๋“  ์—ฐ์‚ฐ์˜ time complexity๊ฐ€ $O(1)$๋กœ ํ‘œํ˜„๋˜๋ฏ€๋กœ ๋งค์šฐ ๋งค์šฐ ์œ ์šฉํ•˜๊ณ  ํŽธ๋ฆฌํ•จ!

 

๐Ÿ’ง 2์ง„์ˆ˜์™€ 10์ง„์ˆ˜ ๊ฐ„์˜ ๋ณ€ํ™˜๋ฐฉ๋ฒ• (python)

โ‘  10์ง„์ˆ˜ → 2์ง„์ˆ˜: bin() ํ•จ์ˆ˜ ์‚ฌ์šฉ (๋ฐ˜ํ™˜ ๊ฒฐ๊ณผ string)

print(bin(100)) #0b1100100 #type 'str'

 

โ‘ก 2์ง„์ˆ˜ → 10์ง„์ˆ˜

(1) 2์ง„์ˆ˜๊ฐ€ 0๊ณผ 1๋กœ ๊ตฌ์„ฑ๋œ ์ˆซ์ž๋ผ๋ฉด ์•ž์— 0b๋ฅผ ๋ถ™์ด๊ณ  ์ถœ๋ ฅ

(2) 2์ง„์ˆ˜๊ฐ€ ๋ฌธ์ž์—ด ํ˜•ํƒœ๋ผ๋ฉด int()์— ๋ฌธ์ž์—ด๊ณผ 2๋ฅผ ์ง€์ •ํ•ด ๋ณ€ํ™˜

โ€ป bin์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜๋˜๋ฏ€๋กœ, 0b๋ฅผ ๋ถ™์ธ ์ˆ˜๋Š” intํ˜•์ด๊ธฐ์— type์ด ์„œ๋กœ ์•ˆ๋งž๋‹ค. ๋”ฐ๋ผ์„œ, bin์˜ ๊ฒฐ๊ณผ๋ฅผ intํ•จ์ˆ˜(๋‘๋ฒˆ์งธ ์ธ์ž์— ๊ผญ 2๋ฅผ ๋„ฃ์–ด์ค˜์•ผ ํ•จ)๋ฅผ ์‚ฌ์šฉํ•ด type์„ ๋ฐ˜๋“œ์‹œ ๋งž์ถฐ์ค˜์•ผ ํ•จ!

print(0b1100100) #100
print(int('1100100',2)) #100

* ๋น„ํŠธ ๋งˆ์Šคํฌ

→ ์žฅ์ 

โ‘  ๋” ๋น ๋ฅธ ์ˆ˜ํ–‰์‹œ๊ฐ„

โ‘ก ๋” ๊ฐ„๊ฒฐํ•œ code - ๋‹ค์–‘ํ•œ ์ง‘ํ•ฉ ์—ฐ์‚ฐ๋“ค์„ ๋ฐ˜๋ณต๋ฌธ ์—†์ด ํ•œ ์ค„์— ์ž‘์„ฑ ๊ฐ€๋Šฅ!

โ‘ข ๋” ์ž‘์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ - ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•ด ๋‘์–ด ํ”„๋กœ๊ทธ๋žจ ์†๋„ ํ–ฅ์ƒ, ์บ์‹œ ํšจ์œจ good, ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋” ์ ์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ

* ๋น„ํŠธ ์—ฐ์‚ฐ์ž

  • AND ์—ฐ์‚ฐ(&): ๋Œ€์‘ํ•˜๋Š” ๋‘ bit๊ฐ€ ๋ชจ๋‘ 1์ผ ๋•Œ, 1 ๋ฐ˜ํ™˜
  • OR ์—ฐ์‚ฐ(|): ๋Œ€์‘ํ•˜๋Š” ๋‘ bit๊ฐ€ ํ•˜๋‚˜๋ผ๋„ 1์ผ ๋•Œ, 1 ๋ฐ˜ํ™˜
  • XOR ์—ฐ์‚ฐ(^): ๋Œ€์‘ํ•˜๋Š” ๋‘ bit๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅด๋ฉด, 1 ๋ฐ˜ํ™˜
  • NOT ์—ฐ์‚ฐ(~): bit์˜ ๊ฐ’์„ ๋ฐ˜์ „ํ•˜์—ฌ ๋ฐ˜ํ™˜ (1์ด๋ฉด 0, 0์ด๋ฉด 1)
  • ์™ผ์ชฝ shift ์—ฐ์‚ฐ(<<): ์™ผ์ชฝ์œผ๋กœ bit๋ฅผ ์˜ฎ๊ธด๋‹ค (2๋ฐฐ ๊ณฑํ•ด์ง€๋Š” ์˜๋ฏธ) (์˜ค๋ฅธ์ชฝ ์ƒˆ๋กœ ์ƒ๊ธฐ๋Š” ๊ณต๊ฐ„์€ 0 ๋‚˜์˜ด)
  • ์˜ค๋ฅธ์ชฝ shift ์—ฐ์‚ฐ(>>): ์˜ค๋ฅธ์ชฝ์œผ๋กœ bit๋ฅผ ์˜ฎ๊ธด๋‹ค (1/2๊ณฑํ•ด์ง€๋Š”, ์ฆ‰ 2๋กœ ๋‚˜๋ˆ ์ง€๋Š” ์˜๋ฏธ + 1์ด ์‚ฌ๋ผ์ง€๋Š” ๊ณต๊ฐ„์€ 0 ๋‚˜์˜ด)

* NOT ์—ฐ์‚ฐ ์ œ์™ธ ๋ชจ๋“  bit ์—ฐ์‚ฐ์ž ๋ณตํ•ฉ ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ ๊ฐ€๋Šฅ! (&=, |=, ^=, <<=, >>=)

* ๋น„ํŠธ ์—ฐ์‚ฐ์ž ์˜ˆ์ œ

โ‘  ๊ณต์ง‘ํ•ฉ / ๊ฝ‰ ์ฐฌ ์ง‘ํ•ฉ ํ‘œํ˜„

ํ•จ์ˆ˜ bin() ์‚ฌ์šฉ (bin()์•ˆ์— 2์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์‹ถ์€ 10์ง„์ˆ˜๋ฅผ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค; ์•ž์— 0b๋Š” 2์ง„์ˆ˜์ž„์„ ๋œปํ•จ)

 

→ ๊ณต์ง‘ํ•ฉ

zero=bin(0)
print(zero) #0b0

 

→ ๊ฝ‰ ์ฐฌ ์ง‘ํ•ฉ

ex) ์˜ˆ๋ฅผ ๋“ค์–ด 1๋กœ ๊ฝ‰์ฐฌ 5bit๋ฅผ ํ‘œํ˜„ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด(0b11111), 2์ง„์ˆ˜ ์—ฐ์‚ฐ ์ƒ (0b100000 - 0b1) ์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•˜๋ฉด ๋œ๋‹ค. 0b100000์€ 1์„ ์™ผ์ชฝ์œผ๋กœ ๊ณ„์† shiftํ•˜๋Š” << ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋จ (1<<5)

full=(1<<5)-1
print(bin(full)) #0b11111

 

โ‘ก ๊ตณ์ด 2์ง„์ˆ˜ 0b๋กœ ๋ถ™์—ฌ ํ‘œํ˜„์„ ์•ˆํ•˜๋”๋ผ๋„ 10์ง„์ˆ˜ ์ˆ˜๋ผ์ง€ ๋น„ํŠธ ์—ฐ์‚ฐ์ž ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. (๊ฒฐ๊ณผ๋Š” ๋™์ผ)

print(0b11 & 0b10) #2
print(3 & 2) #2

* bitmasking ํ™œ์šฉ ์˜ˆ์ œ>

โ€ป ๋น„ํŠธ๋งˆ์Šคํ‚น์€ ๊ด€๋ จ ๋ฌธ์ œ๋ฅผ ๋งŽ์ด ํ’€๋ฉด์„œ bit operator์— ๊ณ„์† ์ ์‘์„ ํ•˜๋Š” ๊ฒŒ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค โ€ป

 

๐Ÿ’ง ์ง‘ํ•ฉ ์—ฐ์‚ฐ์—์„œ, 1๋ถ€ํ„ฐ N๊นŒ์ง€ ๊ฐ๊ฐ์˜ ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ์ž๋ฆฌ์ˆ˜์— 1, ์—†๋‹ค๋ฉด 0์„ ์ž…๋ ฅํ•ด 2์ง„์ˆ˜์˜ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด checking, removing, adding ๋“ฑ๋“ฑ ๋‹ค์–‘ํ•œ ์—ฐ์‚ฐ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์ง‘ํ•ฉ ์—ฌ๋ถ€ ํฌํ•จ ์—ฌ๋ถ€์— ๋”ฐ๋ฅธ ๊ณ„์‚ฐ, ์ถ”๊ฐ€, ์‚ญ์ œ ์—ฐ์‚ฐ์„ bimasking์œผ๋กœ ์—ฐ์‚ฐ ๊ฐ€๋Šฅ(๋ฐฑ์ค€ 11723 ์ฐธ์กฐ)

๐Ÿ’ง ํ•™๊ต ๊ณผ๋ชฉ๋ณ„ ๊ต์‹œ๊ฐ€ ์ฃผ์–ด์ ธ ์žˆ๊ณ , ํ•™์ƒ๋ณ„๋กœ ์‰ฌ๋Š” ์‹œ๊ฐ„ ๊ต์‹œ๊ฐ€ ์ฃผ์–ด์ ธ ์žˆ์„ ๋•Œ, ํ•™์ƒ์ด ํ•ด๋‹น ๊ณผ๋ชฉ์„ ๋“ค์„ ์ˆ˜ ์žˆ๋Š” ์ง€์˜ ์—ฌ๋ถ€๋ฅผ bitmasking &์—ฐ์‚ฐ์ž๋กœ ์—ฐ์‚ฐ ๊ฐ€๋Šฅ(๋ฐฑ์ค€ 14569 ์ฐธ์กฐ)

* ๋ฐฑ์ค€ ๋ฌธ์ œ ๋ชจ์Œ>

→ ๊ณ„์† ์—…๋Žƒ ์˜ˆ์ •

 

 

 

 

 

 


* ๋‚ด์šฉ1) https://dojang.io/mod/page/view.php?id=2460 

* ๋‚ด์šฉ2) https://leeiopd.tistory.com/entry/%EC%A2%85%EB%A7%8C%EB%B6%81-%EB%B9%84%ED%8A%B8%EB%A7%88%EC%8A%A4%ED%81%AC-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-Python-%ED%8C%8C%EC%9D%B4%EC%8D%AC

* ๋‚ด์šฉ3) https://velog.io/@1998yuki0331/Python-%EB%B9%84%ED%8A%B8-%EB%A7%88%EC%8A%A4%ED%82%B9-%EC%A0%95%EB%A6%AC

'Computer Science > Algorithms' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Regular Expression  (0) 2023.01.11
๐Ÿ›Dynamic Programming๐Ÿ›  (1) 2023.01.03
๐Ÿ‘€ Binary Search ๐Ÿ‘€  (2) 2022.12.06
understanding pesudo-code of QuickSort  (0) 2022.12.05
DFS / BFS  (0) 2022.10.14

๋Œ“๊ธ€