2 min read

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

Table of Contents

PS์—์„œ ์ž์ฃผ ์“ฐ์ด๋Š” ๊ธฐ๋ฒ•์ธ ๋น„ํŠธ๋งˆ์Šคํฌ ์ •๋ฆฌ

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

  • AND a & b
  • OR a | b
  • XOR a ^ b
  • NOT ~a
  • ์ •์ˆ˜ a๋ฅผ ์™ผ์ชฝ์œผ๋กœ b๋น„ํŠธ ์‹œํ”„ํŠธ a << b
  • ์ •์ˆ˜ a๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ b๋น„ํŠธ ์‹œํ”„ํŠธ a >> b

์œ ์˜ํ•  ์ 

  1. ๋น„ํŠธ ์—ฐ์‚ฐ์ž์˜ ์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„๋Š” == ๋“ฑ ๋น„๊ต ์—ฐ์‚ฐ์ž๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ด„ํ˜ธ๋ฅผ ๊ผญ ๋ถ™์—ฌ์ฃผ์ž. bool ret = ((a & b) == 5);
  2. 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)

subsub์—์„œ 1์„ ๋นผ๋ฉด ์ผœ์ ธ ์žˆ๋˜ ์ตœํ•˜์œ„ ๋น„ํŠธ๊ฐ€ ๊บผ์ง€๊ณ , ๊ทธ ๋ฐ‘์— ์žˆ๋Š” ๋น„ํŠธ๋Š” ์ „๋ถ€ ์ผœ์ง„๋‹ค. ์ด ๊ฒฐ๊ณผ์™€ maskmask์˜ AND ์—ฐ์‚ฐ์œผ๋กœ ๋ชจ๋“  ๋ถ€๋ถ„ ์ง‘ํ•ฉ์„ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋‹ค.