PS์์ ์์ฃผ ์ฐ์ด๋ ๊ธฐ๋ฒ์ธ ๋นํธ๋ง์คํฌ ์ ๋ฆฌ
๋นํธ ์ฐ์ฐ์
- AND
a & b - OR
a | b - XOR
a ^ b - NOT
~a - ์ ์ a๋ฅผ ์ผ์ชฝ์ผ๋ก b๋นํธ ์ํํธ
a << b - ์ ์ a๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก b๋นํธ ์ํํธ
a >> b
์ ์ํ ์
- ๋นํธ ์ฐ์ฐ์์ ์ฐ์ฐ์ ์ฐ์ ์์๋
==๋ฑ ๋น๊ต ์ฐ์ฐ์๋ณด๋ค ์ฐ์ ์์๊ฐ ๋ฎ๋ค. ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ๊ดํธ๋ฅผ ๊ผญ ๋ถ์ฌ์ฃผ์.bool ret = ((a & b) == 5); - 64๋นํธ ์ ์์์ ๋นํธ ์ฐ์ฐ์ ํ ๋ ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ์ฃผ์ํด์ผ ํ๋ค.
(1LL << 60)
๋นํธ ์ ๋ถ ์ฑ์ฐ๊ธฐ
int mask = (1 << N) - 1;
์์ ์ถ๊ฐํ๊ธฐ
mask |= (1 << p);
์์์ ํฌํจ ์ฌ๋ถ ํ์ธํ๊ธฐ
if (mask & (1 << p))
๋น๊ต ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ ((mask & (1 << p)) == 0) ์ด๋ ๊ฒ ๊ดํธ๋ก ๋ฌถ์ด์ฃผ์.
์์ ์ญ์ ํ๊ธฐ
mask &= ~(1 << p);
p๋ฒ ๋นํธ๋ฅผ ์ ์ธํ๊ณ ๋ชจ๋ ์ผ์ ธ์๋ ์ซ์์ AND ์ฐ์ฐ
์์ ํ ๊ธ
mask ^= (1 << p);
์งํฉ์ ํฌ๊ธฐ ๊ตฌํ๊ธฐ
int bitcount(int x) {
if (x == 0) return 0;
return x % 2 + bitcount(x / 2);
}
g++์์๋ __builtin_popcount(mask)๋ก ์ฝ๊ฒ ๊ตฌํ ์ ์๋ค.
์ตํ์ ์์ ๊ตฌํ๊ธฐ
g++์์๋ __builtin_ctz(mask)๋ก ์ตํ์ ์์์ ์์น๋ฅผ ์ฝ๊ฒ ๊ตฌํ ์ ์๋ค.
int m = (mask & -mask);๋ก ์์น ๋์ ๋นํธ๋ฅผ ์ง์ ๊ตฌํ ์ ์๋ค.
2์ ๋ณด์๋ฅผ ์ฌ์ฉํ๋ ์์คํ
์์๋, ์์๋ฅผ ํํํ๊ธฐ ์ํด ๋นํธ๋ฅผ ๋ค์ง๊ณ ๊ทธ ๊ฒฐ๊ณผ์ 1์ ๋ํ๊ธฐ ๋๋ฌธ.
์ตํ์ ์์ ์ง์ฐ๊ธฐ
mask &= (mask - 1);
๋ชจ๋ ๋ถ๋ถ ์งํฉ ์ํํ๊ธฐ
for (int sub = mask; sub > 0; sub = (sub - 1) & mask)
์์ 1์ ๋นผ๋ฉด ์ผ์ ธ ์๋ ์ตํ์ ๋นํธ๊ฐ ๊บผ์ง๊ณ , ๊ทธ ๋ฐ์ ์๋ ๋นํธ๋ ์ ๋ถ ์ผ์ง๋ค. ์ด ๊ฒฐ๊ณผ์ ์ AND ์ฐ์ฐ์ผ๋ก ๋ชจ๋ ๋ถ๋ถ ์งํฉ์ ๋ฐฉ๋ฌธํ ์ ์๋ค.