Post

๐ŸฆŠ 3. Binary Search & Bitwise Operations

05. ๋น„ํŠธ ์กฐ๊ฐ

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

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

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

4๋น„ํŠธ๋กœ ํ‘œํ˜„๋œ ์ •์ˆ˜ -3 ์—์„œ ๋น„ํŠธ 1๊ฐœ๋Š” ๋ถ€ํ˜ธ, ๋‚˜๋จธ์ง€ 3๊ฐœ๊ฐ€ ๊ฐ’์„ ํ‘œํ˜„ํ•  ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฌ๋ฉด 2^3 ์— ๋Œ€ํ•œ ๋ณด์ˆ˜๋ฅผ ๊ตฌํ•˜๋ฉด-3์˜ 8์— ๋Œ€ํ•œ ๋ณด์ˆ˜๋Š” 5์ด๋‹ค.

๋”ฐ๋ผ์„œ -3 ์„ 4๋น„ํŠธ์˜ 2์ง„์ˆ˜๋กœ ํ‘œํ˜„ํ•˜๋ฉด 1101 ์ด๋‹ค.

๋‹ค์‹œ ๋งํ•ด -K ๋ฅผ N ๋น„ํŠธ์˜ 2์ง„์ˆ˜๋กœ ํ‘œํ˜„ํ•˜๋ฉด concat(1, 2^(N-1) - K) ๊ฐ€ ๋œ๋‹ค.

๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ์–‘์ˆ˜๋กœ ํ‘œํ˜„๋œ 2์ง„์ˆ˜๋ฅผ ๋’ค์ง‘์€ ๋’ค 1์„ ๋”ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

3์€ 011์ธ๋ฐ ๋’ค์ง‘์œผ๋ฉด 100์ด ๋˜๊ณ  1์„ ๋”ํ•˜๋ฉด 101์ด ๋œ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ถ€ํ˜ธ๋น„ํŠธ๋ฅผ ์•ž์— ๋ถ™์ด๋ฉด 1011์ด๋‹ค

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

์šฐ์ธก ์‹œํ”„ํŠธ ์—ฐ์‚ฐ์—๋Š” ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค.

์‚ฐ์ˆ  ์šฐ์ธก ์‹œํ”„ํŠธ๋Š” 2๋กœ ๋‚˜๋ˆˆ ๊ฒฐ๊ณผ์™€ ๊ฐ™๋‹ค.

๋น„ํŠธ๋ฅผ ์˜†์œผ๋กœ ์˜ฎ๊ธฐ์ง€๋งŒ ์ตœ์ƒ์œ„ ๋ถ€ํ˜ธ๋น„ํŠธ๋Š” ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค.

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

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

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

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

์ด ๋ฉ”์„œ๋“œ๋Š” 1์„ i ๋น„ํŠธ๋งŒํผ ์‹œํ”„ํŠธํ•ด์„œ 00010000๊ณผ ๊ฐ™์€ ๊ฐ’์„ ๋งŒ๋“ ๋‹ค.

๊ทธ ๋‹ค์Œ AND ์—ฐ์‚ฐ์œผ๋กœ num ์˜ i ๋ฒˆ์งธ ๋น„ํŠธ๋ฅผ ๋บ€ ๋‚˜๋จธ์ง€ ๋น„ํŠธ๋ฅผ ๋ชจ๋‘ ์‚ญ์ œํ•œ ๋’ค, ์ด ๊ฐ’์„ 0๊ณผ ๋น„๊ตํ•œ๋‹ค.

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

1
2
3
boolean getBit(int num, int i) {
	return ((num & (i << i)) != 0);
}

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

1์„ i ๋น„ํŠธ๋งŒํผ ์‹œํ”„ํŠธํ•œ ํ›„ OR ์—ฐ์‚ฐ์„ ํ†ตํ•ด num ์˜ i ๋ฒˆ์งธ ๋น„ํŠธ๊ฐ’์„ ๋ฐ”๊พผ๋‹ค.

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

1
2
3
int setBit(int num, int i) {
	return num | (1 << i);
}

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

NOT ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด num ๊ณผ AND ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

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

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

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

i ๋ฒˆ์งธ ๋น„ํŠธ๋ฅผ 1๋กœ ์„ธํŒ…ํ•œ๋’ค ์ด ๊ฐ’์—์„œ 1์„ ๋นผ๋ฉด i ๋ฒˆ์งธ ๋น„ํŠธ ๋ฐ‘์ด ๋ชจ๋‘ 1๋กœ ์„ธํŒ…๋œ๋‹ค.

ํ•˜์œ„ i ๋ฒˆ์งธ ๋น„ํŠธ๋ฅผ ๋บ€ ๋‚˜๋จธ์ง€ ๋น„ํŠธ๋ฅผ ๋ชจ๋‘ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

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

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

๋ชจ๋“  ๋น„ํŠธ๊ฐ€ 1๋กœ ์„ธํŒ…๋œ -1์„ ์™ผ์ชฝ์œผ๋กœ i + 1 ๋งŒํผ ์‹œํ”„ํŠธ ํ•œ๋‹ค.

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

1
2
3
4
int clearBitMSBthroughI(int num, int i) {
	int mask = (-1 << (i + 1));
	return num & mask;
}

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

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

v ๋ฅผ ์™ผ์ชฝ์œผ๋กœ i ๋ฒˆ ์‰ฌํ”„ํŠธํ•œ ๊ฐ’์„ OR ์—ฐ์‚ฐ์œผ๋กœ ๋Œ€์ž…ํ•œ๋‹ค.

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);
}

10. ์ •๋ ฌ๊ณผ ํƒ์ƒ‰ - ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์ด์ง„ ํƒ์ƒ‰(Binary Search)์€ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ ์›์†Œ x๋ฅผ ์ฐพ๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

x๋ฅผ ์ค‘๊ฐ„์— ์œ„์น˜ํ•œ ์›์†Œ์™€ ๋น„๊ตํ•œ ๋’ค, x๊ฐ€ ์ค‘๊ฐ„์— ์œ„์น˜ํ•œ ๊ฐ’๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ๋ฐฐ์—ด์˜ ์™ผ์ชฝ ์ ˆ๋ฐ˜์„ ์žฌํƒ์ƒ‰ํ•˜๊ณ ,

ํฌ๋‹ค๋ฉด ๋ฐฐ์—ด์˜ ์˜ค๋ฅธ์ชฝ ์ ˆ๋ฐ˜์„ ์žฌํƒ์ƒ‰ ํ•œ๋‹ค.

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int binarySearch(int[] a, int x) {
	int low = 0;
	int high = a.length - 1;
	int mid;
	while (low <= high) {
		mid = (low + high) / 2;
		if (a[mid] < x) {
			low = mid + 1;
		} else if (a[mid] > x) {
			high = mid - 1;
		} else {
			return mid;
		}
	}
	return -1;
}
This post is licensed under CC BY 4.0 by the author.