-
2024 - 10- 18 C++ 코딩테스트 10주완성 D+48Language Grammar/C++ 2024. 10. 18. 18:10
비트마스킹 활용법
idx번째 비트끄기 S &= ~(1 << idx) idx번째 비트 XOR 연산 S ^= ( 1 << idx) 최하위 켜져있는 비트 찾기 idx = (S & -S) 크기가 n인 집합의 모든 비트를 켜기 (1 << n) -1 idx번째 비트를 켜기 S |= ( 1 << idx) idx번째 비트가 켜져 있는지 확인하기 if(S & (1 << idx)) 1. idx 번째 비트끄기 ( S &= ~(1 << idx))
예시를 들어 S = 10010(18) 이라는 비트가 있다고 하자
이중에서 10010 이 부분의 비트를 끄고 싶다면
1에 해당하는 인덱스를 1 << 1(해당 인덱스번호) 하여 반전하고 싶은 비트만 따로 만들어준다.
그러면 00010 이라는 비트가 만들어진다. 이 비트를 ~ 연산자를 사용하여 뒤집어 준다.
그러면 11101 이라는 비트가 만들어지고 이 비트를 S 와 & 연산자를 하면 10000 이라는 비트가 나온다!2. idx 번째 비트 XOR 연산 ( S ^= ( 1 << idx))
예시를 들어 S = 10010(18) 이라는 비트가 있다고 하자
이중에서 10010 이 부분의 비트를 XOR 연산하고 싶다면
1에 해당하는 인덱스를 1 << 1(해당 인덱스번호) 하여 해당인덱스만 따로 빼내어준다.
00010 이라는 비트값이 나올 것이다.
이것을 S 와 ^(XOR) 을 하여주면 10010, 00010 둘다 1이므로 0으로 반환된다!
0일 경우에도 마찬가지다.
마찬가지로 10010를 예로 들고 10010 이 부분의 비트를 XOR 연산하고 싶다면
똑같이 0에 해당하는 인덱스 1 << 2 하여주면 00100 이다.
이를 S 와 ^(XOR) 하여주면 10010 , 00100 하나가 1이므로 1을 반환한다!
따라서 해당 인덱스가 0일떄 1을 반환 1일때 0을 반환시키는 XOR 연산이 된다.3. 최하위 켜져있는 비트 찾기 ( idx = (S & -S))
주어진 비트의 오른쪽부터 탐색하여 1인 인덱스를 반환시켜주면 된다.
예시를 들어 10010(18) 이 주어졌다고 치자.
10010을 ~ 연산자를 이용하면
~S = -(S + 1) 이므로 01101 + 1 이다. 따라서 01110 이라는 값이 나온다.
이를 S 랑 & 연산하여주면 10010 & 01110 = 00010 이라는 비트가 나오게 된다!4.크기가 n인 집합의 모든 비트를 켜기 ( (1 << n) - 1)
예를 들어 1 << 4 를하여 10000 이라는 비트가 있다고 하자.
여기다가 -1 연산을 하여주면 01111 이라는 비트가 나온다.
따라서 (1 << n) 을 하여준 뒤 -1 연산을 하여주면 크기가 n인 집합을 모두 켤 수 있다!5.idx 번쨰 비트를 켜기 (S |= (1 << idx))
예를 들어 10010(18) 이라는 비트가 있다.
여기서 10010 의 비트를 키고 싶으면, 1 << 3 을 하여주면 01000 이라는 비트가 나온다.
이를 10010 과 | 연산을 쓰게되면 10010 | 01000 = 11010 이라는 수가 나오게 된다.
그냥 단순하게 해당 인덱스를 1로 만들고 OR 연산자를 이용하여 합쳐주는 것이다!6.idx 번째 비트가 켜져있는지 확인하기 ( if(S & (1 << idx)))
만약 10010 이라는 이진수가 있고, 3번째 비트가 켜져있는지 확인하고 싶다고 가정하자!
먼저 1 << 3 을 하여 00100 을 만들어준다.
그 다음 10010이랑 & 연산을 하면 10010 & 00100 = 0 둘중 하나가 0이여서 0이 반환됐다.
이렇게 idx 번째 비트만 가져와 & 연산을 하여주면 0이면 0이 반환 1이면 1이 반환된다!'Language Grammar > C++' 카테고리의 다른 글
2024 - 10- 25 C++ 코딩테스트 10주완성 D+51 (2) 2024.10.25 2024 - 10- 22 C++ 코딩테스트 10주완성 D+49 (1) 2024.10.22 2024 - 10- 16 C++ 코딩테스트 10주완성 D+46 (0) 2024.10.16 2024 - 10- 09 C++ 코딩테스트 10주완성 D+45 (2) 2024.10.10 2024 - 10- 02 C++ 코딩테스트 10주완성 D+44 (1) 2024.10.02