1. ์ด์ง์. Boolean ๋ฐฐ์ด/๋ฒกํฐ.
<ใ กใ กใ กใ กใ กใ กใ กใ กใ ก
128 64 32 16 8 4 2 1
1 0 1 1 0 0 0 0(176)
0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
2. ๋นํธ ์ฐ์ฐ์
& | ๋นํธ๋จ์๋ก AND ์ฐ์ฐ |
| | ๋นํธ๋จ์๋ก OR ์ฐ์ฐ |
^ | ๋นํธ๋จ์๋ก XOR ์ฐ์ฐ(๊ฐ์ผ๋ฉด 0, ๋ค๋ฅด๋ฉด 1) |
~ | ํผ์ฐ์ฐ์์ ๋ชจ๋ ๋นํธ ๋ฐ์ |
<< | ํผ์ฐ์ฐ์์ ๋นํธ ์ด์ ์ผ์ชฝ์ผ๋ก ์ด๋ |
>> | ํผ์ฐ์ฐ์์ ๋นํธ ์ด์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ |
* 10์ง์ -> 2์ง์ ๋ณํ ์ฌ์ดํธ
* ๋นํธ ์ฐ์ฐ ๊ณต์
a >> b = (int) a * (1/2)^b
a << b = a * 2^b
3. ๋นํธ์ ์์ํํ
: ๋นํธ ๋ฐ์ ํ๊ณ +1 ํ ๊ฐ
*๋นํธ ์์์ฐ์ฐ ๊ณต์
~a = -(a + 1)
ex) 0001000(8) ์์๋ง๋ค๊ธฐ: 0001000 --(๋นํธ๋ฐ์ )--> 1110111 --(1๋ํ๊ธฐ)--> 1111000(120)
4. ๋นํธ ์ฐ์ฐ์ ํ์ฉ๋ฒ
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 ๋ฒ์งธ ๋นํธ๋๊ธฐ
ex. 10010 ์ 1๋ฒ์งธ ๋นํธ๋๊ธฐ.
10010 & ~(1 << 1) = 10010 & ~(10) = 10010 & 01 = 10000
2) idx ๋ฒ์งธ ๋นํธ๋ฅผ XOR ์ฐ์ฐ์ ์ทจํ๊ธฐ
ex. 10010 ์ 0๋ฒ์งธ ๋นํธ๊ฐ 1์ด๋ฉด 0, 0์ด๋ฉด 1๋ก ๋ฐ๊พธ๊ธฐ(XOR ์ฐ์ฐ)
10010 ^ ~(1 << 1) = 10010 ^ ~(10) = 10010 ^ 01 = 10011
3) ์ตํ์ ์ผ์ ธ์๋ ๋นํธ ์ฐพ๊ธฐ
cf. ์ตํ์ ๋นํธ: 10010 ์ด๋ฉด 1๋ฒ์งธ 1, 10001 ์ด๋ฉด 0๋ฒ์งธ 1.
cf. ~S = -(S+1)
ex. 10010 ์์ ์ตํ์ ์ผ์ ธ ์๋ ๋นํธ ์ฐพ๊ธฐ.
10010 & -10010 = 10010 & (~10010 + 1) = 10010 & (01101 + 1) = 10010 & 01110 = 00010
4) ํฌ๊ธฐ๊ฐ n์ธ ์งํฉ์ ๋ชจ๋ ๋นํธ์ผ๊ธฐ
ex. n์ด 4์ธ ๋ชจ๋ ๋นํธ์ผ๊ธฐ.
(1 << 4) - 1 = 10000 - 1 = 1111
ex. n์ด 5์ธ ๋ชจ๋ ๋นํธ์ผ๊ธฐ.
(1 << 5) - 1 = 100000 - 1 = 11111
5) idx ๋ฒ์งธ ๋นํธ์ผ๊ธฐ
ex. 10010 ์ 0๋ฒ์งธ ๋นํธ์ผ๊ธฐ.
10010 | (1 << 0) = 10010 | (00001) = 10011
6) idx ๋ฒ์งธ ๋นํธ๊ฐ ์ผ์ ธ ์๋์ง ํ์ธํ๊ธฐ
ex. 10010 ์ 3๋ฒ์งธ ๋นํธ๊ฐ ์ผ์ ธ์๋์ง ํ์ธํ๊ธฐ
if(10010 & (1 << 3)) = if(10010 & 1000) = if(00000) = 0 = ๊บผ์ ธ ์์.
ex. 10010 ์ 1๋ฒ์งธ ๋นํธ๊ฐ ์ผ์ ธ์๋์ง ํ์ธํ๊ธฐ
if(10010 & (1 << 1)) = if(10010 & 10) = if(00010) = 1 = ์ผ์ ธ ์์.
5. ๋นํธ๋ง์คํน, ๊ฒฝ์ฐ์ ์, ๋งค๊ฐ๋ณ์
*๋นํธ๋ง์คํน
: boolean ๋ฐฐ์ด ์ญํ ์ ํ๋ ํ๋์ ์ซ์๋ฅผ ๋ง๋ค์ด์ ๋นํธ ์ฐ์ฐ์๋ฅผ ํตํด ํ์, ์์ ๋ฑ์ ์์ ์ ์ํํ๋ ๊ฒ.
*๋นํธ๋ง์คํน์ ์ด์ฉํ ๊ฒฝ์ฐ์ ์
Q. {์ฌ๊ณผ, ๋ธ๊ธฐ, ํฌ๋, ๋ฐฐ} ์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์ ๊ตฌํ๊ธฐ.
A. ์ด 16๊ฐ์ง ๊ฒฝ์ฐ์ ์. (ํฌํจํ๊ฑฐ๋ ํฌํจํ์ง ์๊ฑฐ๋์ ๊ฒฝ์ฐ์ ์๋ก 2^4 = 16๊ฐ์ง๊ฐ ๋์ด)
#include <iostream>
using namespace std;
const int FRUITS_NUM = 4;
int main(){
string fruits[FRUITS_NUM] = {"์ฌ๊ณผ", "๋ธ๊ธฐ", "ํฌ๋", "๋ฐฐ"};
for(int i = 0; i < (1 << FRUITS_NUM); i++){ // 0000(0) ~ 1111(15) ๊น์ง ๊ฒฝ์ฐ์ ์ ๊ตฌํ๊ธฐ(10000 ๋ณด๋ค ์์)
string result = "";
for(int j = 0; j < FRUITS_NUM; j++){ // 0 ~ 3 ์๋ฆฌ๋ฅผ ๋๋ฉด์ ์ผ์ ธ ์๋ ๋นํธ ์ฐพ๊ธฐ
if(i & (1 << j)){ // ์ผ์ ธ ์๋ ~?
result += (fruits[j] + " ");
}
}
cout << result << '\n';
}
return 0;
}
: ๋นํธ๋ง์คํน 0 1 ๋ก ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ฒดํฌํ๋ฉฐ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ค.
๋ฐ๊นฅ for๋ฌธ i
0 ~ 1111(10000๋ณด๋ค ์์ ๋ ๊น์ง) ๊น์ง ์ ๋๋ฆฌ๊ธฐ. (0~15. 16๊ฐ์ง ๊ฒฝ์ฐ์ ์)
์์ชฝ for๋ฌธ j
0 ~ 3 ์๋ฆฌ๋ฅผ ๋๋ฉฐ(4๋ณด๋ค ์์ ๋ ๊น์ง) ํ์ฌ ์๋ฆฌ๊ฐ ์ผ์ ธ ์๋์ง ํ์ธํ๊ธฐ
0 & (1 << 0) = 0000
0 & (1 << 1) = 0000
0 & (1 << 2) = 0000
0 & (1 << 3) = 0000
1 & (1 << 0) = 0001 & 0001 = 0001 ์ฌ๊ณผ
1 & (1 << 1) = 0001 & 0010 = 0000
1 & (1 << 2) = 0001 & 0100 = 0000
1 & (1 << 3) = 0001 & 1000 = 0000
2 & (1 << 0) = 0010 & 0001 = 0000
2 & (1 << 1) = 0010 & 0010 = 0010 ๋ธ๊ธฐ
2 & (1 << 2) = 0010 & 0100 = 0000
2 & (1 << 3) = 0010 & 1000 = 0000
3 & (1 << 0) = 0011 & 0001 = 0001 ์ฌ๊ณผ
3 & (1 << 1) = 0011 & 0010 = 0010 ๋ธ๊ธฐ
3 & (1 << 2) = 0011 & 0100 = 0000
3 & (1 << 3) = 0011 & 1000 = 0000
4 & (1 << 0) = 0100 & 0001 = 0000
4 & (1 << 1) = 0100 & 0010 = 0000
4 & (1 << 2) = 0100 & 0100 = 0100 ํฌ๋
4 & (1 << 3) = 0100 & 1000 = 0000
5 & (1 << 0) = 0101 & 0001 = 0001 ์ฌ๊ณผ
5 & (1 << 1) = 0101 & 0010 = 0000
5 & (1 << 2) = 0101 & 0100 = 0100 ํฌ๋
5 & (1 << 3) = 0101 & 1000 = 0000
6 & (1 << 0) = 0110 & 0001 = 0000
6 & (1 << 1) = 0110 & 0010 = 0010 ๋ธ๊ธฐ
6 & (1 << 2) = 0110 & 0100 = 0100 ํฌ๋
6 & (1 << 3) = 0110 & 1000 = 0000
7 & (1 << 0) = 0111 & 0001 = 0001 ์ฌ๊ณผ
7 & (1 << 1) = 0111 & 0010 = 0010 ๋ธ๊ธฐ
7 & (1 << 2) = 0111 & 0100 = 0100 ํฌ๋
7 & (1 << 3) = 0111 & 1000 = 0000
8 & (1 << 0) = 1000 & 0001 = 0000
8 & (1 << 1) = 1000 & 0010 = 0000
8 & (1 << 2) = 1000 & 0100 = 0000
8 & (1 << 3) = 1000 & 1000 = 1000 ๋ฐฐ
...
15 & (1 << 0) = 1111 & 0001 = 0001 ์ฌ๊ณผ
15 & (1 << 1) = 1111 & 0010 = 0010 ๋ธ๊ธฐ
15 & (1 << 2) = 1111 & 0100 = 0100 ํฌ๋
15 & (1 << 3) = 1111 & 1000 = 1000 ๋ฐฐ
'๐ Coding Test Study > C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); (0) | 2024.04.15 |
---|---|
๋ฌธ์์ด ASCII code ๊ฐ (0) | 2024.02.17 |
[10์ฃผ ์์ฑ C++ ์ฝ๋ฉํ ์คํธ] ๋์ ํฉ, Prefix Sum (0) | 2023.08.11 |
[10์ฃผ ์์ฑ C++ ์ฝ๋ฉํ ์คํธ] ํ์๊ฐ๋ - map, unique() (0) | 2023.08.06 |
[10์ฃผ ์์ฑ C++ ์ฝ๋ฉํ ์คํธ] ํ์๊ฐ๋ - ๋ฉ๋ชจ๋ฆฌ์ ํฌ์ธํฐ(pointer) (0) | 2023.08.05 |