Post

๐Ÿน 3. Binary Search & Bitwise Operations

05. ๋น„ํŠธ ์กฐ์ž‘

[ ๋น„ํŠธ ์กฐ์ž‘์„ ํ•  ๋•Œ ์•Œ์•„์•ผ ํ•  ์‚ฌ์‹ค๋“ค๊ณผ ํŠธ๋ฆญ๋“ค ]

(0s: ๋ชจ๋“  ๋น„ํŠธ๊ฐ€ 0์ธ ๊ฐ’, 1s: ๋ชจ๋“  ๋น„ํŠธ๊ฐ€ 1์ธ ๊ฐ’)

[ 2์˜ ๋ณด์ˆ˜์™€ ์Œ์ˆ˜ ]

์ปดํ“จํ„ฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ •์ˆ˜๋ฅผ ์ €์žฅํ•  ๋•Œ 2์˜ ๋ณด์ˆ˜ ํ˜•ํƒœ๋กœ ์ €์žฅํ•œ๋‹ค.

์–‘์ˆ˜์˜ ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ, ์Œ์ˆ˜๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ๋Š” ์ ˆ๋Œ“๊ฐ’์— ๋ถ€ํ˜ธ๋น„ํŠธ(sign bit)๋ฅผ 1๋กœ ์„ธํŒ…ํ•œ ๋’ค 2์˜ ๋ณด์ˆ˜๋ฅผ ์ทจํ•œ ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•œ๋‹ค.

์˜ˆ์‹œ

4๋น„ํŠธ๋กœ ํ‘œํ˜„๋œ ์ •์ˆ˜ -3

โ†’ ๋งจ ์•ž์˜ 1์€ ๋ถ€ํ˜ธ๋น„ํŠธ, -3์˜ ์ ˆ๋Œ“๊ฐ’์ธ 3์˜ 8($=2^3$)์— ๋Œ€ํ•œ ๋ณด์ˆ˜๋Š” 5์ด๋ฏ€๋กœ 2์ง„์ˆ˜๋กœ ํ‘œํ˜„ํ•˜๋ฉด 101

๋”ฐ๋ผ์„œ 4๋น„ํŠธ๋กœ ํ‘œํ˜„ํ•˜๋ฉด 1101์ด ๋œ๋‹ค.

[ ์‚ฐ์ˆ  ์šฐ์ธก ์‹œํ”„ํŠธ vs ๋…ผ๋ฆฌ์šฐ์ธก ์‹œํ”„ํŠธ ]

์‚ฐ์ˆ  ์šฐ์ธก ์‹œํ”„ํŠธ(arithmetic right shift)

  • ๊ธฐ๋ณธ์ ์œผ๋กœ 2๋กœ ๋‚˜๋ˆˆ ๊ฒฐ๊ณผ์™€ ๊ฐ™๋‹ค.

๋น„ํŠธ๋ฅผ ์˜†์œผ๋กœ ์˜ฎ๊ธด๋‹ค. ๋‹จ, ๋ถ€ํ˜ธ๋น„ํŠธ๋Š” ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค.

๋”ฐ๋ผ์„œ ์ด ์—ฐ์‚ฐ์€ ๋Œ€๋žต ๊ฐ’์„ 2๋กœ ๋‚˜๋ˆˆ ํšจ๊ณผ๊ฐ€ ์žˆ๊ณ , ยป ์—ฐ์‚ฐ๊ณผ ๊ฐ™๋‹ค.

๋…ผ๋ฆฌ ์šฐ์ธก ์‹œํ”„ํŠธ(logical right shift)

  • ์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋น„ํŠธ๋ฅผ ์˜ฎ๊ธธ ๋•Œ ๋ณด์ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์›€์ง์ธ๋‹ค.

๋น„ํŠธ๋ฅผ ์˜†์œผ๋กœ ์˜ฎ๊ธด ํ›„ ์ตœ์ƒ์œ„ ๋น„ํŠธ(most significant bit)์— 0์„ ๋„ฃ๋Š”๋‹ค.

์ฆ‰, ยป> ์—ฐ์‚ฐ๊ณผ ๊ฐ™๋‹ค.

์˜ˆ์‹œ

x = -93242, count = 40์ผ ๋•Œ ์•„๋ž˜ ํ•จ์ˆ˜๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ๊นŒ?

๋…ผ๋ฆฌ ์‹œํ”„ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ตœ์ƒ์œ„ ๋น„ํŠธ์— 0์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ฑ„์›Œ ๋„ฃ์œผ๋ฏ€๋กœ ๊ฒฐ๊ณผ์ ์œผ๋กœ 0์ด ๋  ๊ฒƒ์ด๋‹ค.

์‚ฐ์ˆ  ์‹œํ”„ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ตœ์ƒ์œ„ ๋น„ํŠธ์— 1์„ ๋ฐ˜๋ณต์ ์‘๋กœ ์ฑ„์›Œ ๋„ฃ๊ฒŒ ๋˜๋ฏ€๋กœ ๊ฒฐ๊ณผ์ ์œผ๋กœ -1์ด ๋  ๊ฒƒ์ด๋‹ค. (๋ชจ๋“  ๋น„ํŠธ๊ฐ€ 1๋กœ ์ฑ„์›Œ์ ธ ์žˆ์œผ๋ฉด -1์ด ๋œ๋‹ค.)

[ ๊ธฐ๋ณธ์ ์ธ ๋น„ํŠธ ์กฐ์ž‘: ๋น„ํŠธ๊ฐ’ ํ™•์ธ ๋ฐ ์ฑ„์›Œ๋„ฃ๊ธฐ ]

๋น„ํŠธ๊ฐ’ ํ™•์ธ

1
2
3
boolean getBit(int num, int i) {
		return ((num & (1 << i)) != 0);
}
  1. 1์„ i๋น„ํŠธ๋งŒํผ ์‹œํ”„ํŠธํ•ด์„œ 00010000๊ณผ ๊ฐ™์€ ๊ฐ’์„ ๋งŒ๋“ ๋‹ค.
  2. AND ์—ฐ์‚ฐ์„ ํ†ตํ•ด num์˜ i๋ฒˆ์งธ ๋น„ํŠธ๋ฅผ ๋บ€ ๋‚˜๋จธ์ง€ ๋น„ํŠธ๋ฅผ ๋ชจ๋‘ ์‚ญ์ œํ•œ ๋’ค, ์ด ๊ฐ’์„ 0๊ณผ ๋น„๊ตํ•œ๋‹ค.

    ๋งŒ์•ฝ ์ด ๊ฐ’์ด 0์ด ์•„๋‹ˆ๋ผ๋ฉด num์˜ i๋ฒˆ์งธ ๋น„ํŠธ๋Š” 1์ด์–ด์•ผ ํ•˜๊ณ , 0์ด๋ผ๋ฉด i๋ฒˆ์งธ ๋น„ํŠธ๋Š” 0์ด์–ด์•ผ ํ•œ๋‹ค.

๋น„ํŠธ๊ฐ’ ์ฑ„์›Œ๋„ฃ๊ธฐ

1
2
3
int setBit(int num, int i) {
		return num | (1 << i);
}
  1. setBit๋Š” 1์„ i๋น„ํŠธ๋งŒํผ ์‹œํ”„ํŠธํ•ด์„œ 00010000๊ณผ ๊ฐ™์€ ๊ฐ’์„ ๋งŒ๋“ ๋‹ค.
  2. OR ์—ฐ์‚ฐ์„ ํ†ตํ•ด num์˜ i๋ฒˆ์งธ ๋น„ํŠธ๊ฐ’์„ ๋ฐ”๊พผ๋‹ค.

    i๋ฒˆ์งธ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋น„ํŠธ๋“ค์€ 0๊ณผ OR ์—ฐ์‚ฐ์„ ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ num์— ์•„๋ฌด ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ์•Š๋Š”๋‹ค.

๋น„ํŠธ๊ฐ’ ์‚ญ์ œํ•˜๊ธฐ

1
2
3
4
int clearBit(int num, int i) {
		int mask = ~(1 << i);
		return num & mask;
}

์ด ๋ฉ”์„œ๋“œ๋Š” setBit๋ฅผ ๊ฑฐ์˜ ๋ฐ˜๋Œ€๋กœ ํ•œ ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

  1. NOT ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด (00010000)์„ 1101111๊ณผ ๊ฐ™์ด ๋งŒ๋“ ๋‹ค.
  2. num๊ณผ AND ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

    ๊ทธ๋Ÿฌ๋ฉด ๋‚˜๋จธ์ง€ ๋น„ํŠธ์˜ ๊ฐ’์€ ๋ณ€ํ•˜์ง€ ์•Š์€ ์ฑ„ num์˜ i๋ฒˆ์งธ ๋น„ํŠธ๊ฐ’๋งŒ ์‚ญ์ œ๋œ๋‹ค.

์ตœ์ƒ์œ„ ๋น„ํŠธ์—์„œ i๋ฒˆ์งธ ๋น„ํŠธ๊นŒ์ง€ ๋ชจ๋‘ ์‚ญ์ œํ•˜๋ ค๋ฉด?

1
2
3
4
int clearBitsMSBthroughI(int num, int i) {
		int mask = (1 << i) - 1;
		return num & mask;
}
  1. (1 << i)๋กœ i๋ฒˆ์งธ ๋น„ํŠธ๋ฅผ 1๋กœ ์„ธํŒ…ํ•œ๋‹ค.
  2. ์ด ๊ฐ’์—์„œ 1์„ ๋บ€๋‹ค.

    ๊ทธ๋Ÿฌ๋ฉด i๋ฒˆ์งธ ๋น„ํŠธ ๋ฐ‘์€ ๋ชจ๋‘ 1๋กœ ์„ธํŒ…๋˜๊ณ  ๊ทธ ์œ„๋กœ๋Š” ๋ชจ๋‘ 0์œผ๋กœ ์„ธํŒ…๋œ๋‹ค.

  3. ์ด mask ๊ฐ’๊ณผ num์„ AND ์—ฐ์‚ฐํ•˜๋ฉด ํ•˜์œ„ i๊ฐœ์˜ ๋น„ํŠธ๋ฅผ ๋บ€ ๋‚˜๋จธ์ง€ ๋น„ํŠธ๋ฅผ ๋ชจ๋‘ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

i๋ฒˆ์งธ ๋น„ํŠธ์—์„œ 0๋ฒˆ์งธ ๋น„ํŠธ๊นŒ์ง€ ๋ชจ๋‘ ์‚ญ์ œํ•˜๋ ค๋ฉด?

1
2
3
4
int clearBitsIthrough0(int num, int i) {
		int mask = (-1 << (i + 1));
		return num & mask;
}
  1. ๋ชจ๋“  ๋น„ํŠธ๊ฐ€ 1๋กœ ์„ธํŒ…๋œ -1์„ ์™ผ์ชฝ์œผ๋กœ i+1๋งŒํผ ์‹œํ”„ํŠธํ•œ๋‹ค.

    ๊ทธ๋Ÿฌ๋ฉด i๋ฒˆ์งธ ๋น„ํŠธ ์œ„๋กœ๋Š” ๋ชจ๋‘ 1๋กœ ์„ธํŒ…๋˜๊ณ  ํ•˜์œ„ i๊ฐœ ๋น„ํŠธ๋Š” ๋ชจ๋‘ 0์œผ๋กœ ์„ธํŒ…๋œ๋‹ค.

๋น„ํŠธ๊ฐ’ ๋ฐ”๊พธ๊ธฐ

i๋ฒˆ์งธ ๋น„ํŠธ๊ฐ’์„ v๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค๋ฉด?

1
2
3
4
5
int updateBit(int num, int i, boolean bitIs1) {
		int value = bitIs1 ? 1 : 0;
		int mask = ~(1 << i);
		return (num & mask) | (value << i);
}
  1. 11101111๊ณผ ๊ฐ™์€ ๊ฐ’์„ ์ด์šฉํ•ด(i=4๋ผ๊ณ  ํ•˜๋ฉด) i๋ฒˆ์งธ ๋น„ํŠธ๊ฐ’์„ ์‚ญ์ œํ•ด์•ผ ํ•œ๋‹ค.
  2. ์šฐ๋ฆฌ๊ฐ€ ๋ฐ”๊พธ๊ณ ์ž ํ•˜๋Š” ๊ฐ’ v๋ฅผ ์™ผ์ชฝ์œผ๋กœ i๋ฒˆ ์‹œํ”„ํŠธํ•œ๋‹ค.

    ๊ทธ๋Ÿฌ๋ฉด i๋ฒˆ์งธ ๋น„ํŠธ๊ฐ’์€ v๊ฐ€ ๋  ๊ฒƒ์ด๊ณ  ๋‚˜๋จธ์ง€๋Š” ๋ชจ๋‘ 0์ด ๋  ๊ฒƒ์ด๋‹ค.

  3. OR ์—ฐ์‚ฐ์„ ์ด์šฉํ•ด i๋ฒˆ์งธ ๋น„ํŠธ๊ฐ’์„ v๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

10. ์ •๋ ฌ๊ณผ ํƒ์ƒ‰

[ ์ด์ง„ ํƒ์ƒ‰ ]

: ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ ์›์†Œ x๋ฅผ ์ฐพ๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉ

  1. ์ค‘๊ฐ„ ์›์†Œ์™€ x๋ฅผ ๋น„๊ตํ•œ๋‹ค.
  2. x๊ฐ€ ๋” ์ž‘๋‹ค๋ฉด ์™ผ์ชฝ ์ ˆ๋ฐ˜์„, x๊ฐ€ ๋” ํฌ๋‹ค๋ฉด ์˜ค๋ฅธ์ชฝ ์ ˆ๋ฐ˜์„ ์žฌํƒ์ƒ‰ํ•œ๋‹ค.

์œ„ ๊ณผ์ •์„ x๋ฅผ ์ฐพ๊ฑฐ๋‚˜ ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ 0์ด ๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

This post is licensed under CC BY 4.0 by the author.