Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Nnnnnnnnn

비트마스크 - 2 본문

Algorithm

비트마스크 - 2

와이제인 2017. 12. 30. 18:38

비트마스크


134를 2진수로 나타내면 10000110 이다. 해당 비트에 1인 경우를 집합으로 나타내면 {1, 2, 7} 이다.  만약 134의 2진수 집합에 0이 포함되어 있는지 검사하려면, 134 & (1<<0)을 하면 된다. 현재 0이 포함되어있지 않으므로 0이 나올 것이고, 1이 포함되어 있는지 검사하여 134 & (1<<1)을 하면 포함되어있어 2가 나올 것이다. 마찬가지로 134 & (1<<2)를 하면 4가 나올 것이다.


만약 1을 추가한다면,  134 | (1<<1)로 나타낼 수 있을 것이다. 134의 2진수 집합에 이미 1이 포함되어 있으므로 그대로 134가 나올 것이다. 3을 추가하여 134 |  (1<<3)을 하면, 집합에 3이 없으므로 3이 추가되어 134에 8을 더한 142가 될 것이다. 추가하는 경우에 or 연산이 아닌 + 연산을 하면, 해당 비트에 1이 더해지겠지만 carry가 발생하여 전체 집합이 달라질 수가 있으므로 or연산을 해야한다.


1을 제거하고 싶다면 134 & ~(1<<1)을 할 수 있다. ~(1<<1)을 수행하면 1 번째 비트는 0이되고 나머지 비트들은 모두 1이된다. 따라서 이를 134와 and 시키면 1과 0이 and 되므로 해당 비트만 제거되어 0으로 바뀌고 나머지는 원래의 비트대로 출력된다.


원하는 비트를 토글하고 싶으면, XOR 연산을 활용할 수 있다. XOR 연산의 경우 두 비트가 다를 경우에만 1을 출력하므로, 134에서 3 번째 비트를 토글하고 싶다면 134 ^ (1<<3)을 수행하여, 해당 비트가 토글되는 것을 볼 수 있다.


전제 집합의 경우, (1<<N)-1 로 나타낼 수 있다. 

'Algorithm' 카테고리의 다른 글

Recursion  (0) 2019.05.20
시간복잡도  (0) 2018.03.27
알고리즘 주의할 점  (0) 2018.03.27
cin과 scanf 속도  (0) 2017.12.30
비트마스크 - 1  (0) 2017.12.30