๐ข 3. Binary Search & Bitwise Operations
๐ก ์ถ๊ฐ ์ง์
- ์ด์ง ํ์/์ด์ง ๊ฒ์ 
- ๋นํธ ์ฐ์ฐ 
๐ซง ํธ๋ฆฌ
- : ํ๋์ ๋ฃจํธ ์ฝ๋๋ฅผ ๊ฐ์ง๋ค
- ๋ฃจํธ ๋ ธ๋๋ 0๊ฐ ์ด์์ ์์ ๋ ธ๋๋ฅผ ๊ฐ๊ณ ์๋ค - ํธ๋ฆฌ์๋ ์ฌ์ดํด ์กด์ฌํ ์ ์๋ค - ๋ ธ๋๋ค์ ํน์  ์์๋ก ๋์ด๋ ์๋ ์๊ณ ๊ทธ๋ด ์ ์์ ์๋ ์๋ค - ๊ฐ ๋ ธ๋๋ ์ด๋ค ์๋ฃํ์ผ๋ก๋ ํํ์ด ๊ฐ๋ฅํ๋ค 
๐ซง ์ด์งํธ๋ฆฌ
: ๊ฐ ๋ ธ๋๊ฐ ์ต๋ ๋ ๊ฐ์ ์์์ ๊ฐ๋ ํธ๋ฆฌ
๐ซง ์ด์งํ์ํธ๋ฆฌ
- : โ๋ชจ๋ ์ผ์ชฝ ์์๋ค โค n < ๋ชจ๋ ์ค๋ฅธ์ชฝ ์์๋คโ ์์ฑ์ ๋ชจ๋ ๋ ธ๋ n์ ๋ํด์ ๋ฐ๋์ ์ฐธ์ด์ด์ผ ํจ
- ๋ชจ๋ ๋ ธ๋์ ๋ํด์ ์ผ์ชฝ ์์๋ค์ ๊ฐ์ด ํ์ฌ ๋ ธ๋ ๊ฐ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋๋ก ํ๊ณ , ์ค๋ฅธ์ชฝ ์์๋ค ๊ฐ์ ํ์ฌ ๋ ธ๋์ ๊ฐ๋ณด๋ค ๋ฐ๋์ ์ปค์ผํจ 
๐ซง ์ ์ด์งํธ๋ฆฌ
- : ๋ชจ๋ ๋ ธ๋์ ์์์ด ์๊ฑฐ๋ ์ ํํ ๋ ๊ฐ ์๋ ๊ฒฝ์ฐ
- ์์์ด ํ๋๋ง ์๋ ๋ ธ๋๊ฐ ์กด์ฌํด์๋ ์๋จ 
๐ซง ํฌํ์ด์งํธ๋ฆฌ
- : ์  ์ด์ง ํธ๋ฆฌ์ด๋ฉด์ ์์  ์ด์ง ํธ๋ฆฌ์ธ ๊ฒฝ์ฐ
- ๋ชจ๋ ๋ง๋จ ๋ ธ๋๋ ๊ฐ์ ๋์ด์ ์์ด์ผ ํ๋ฉฐ, ๋ง์ง๋ง ๋จ๊ณ์์ ๋ ธ๋์ ๊ฐ์๊ฐ ์ต๋๊ฐ ๋์ด์ผ ํ๋ค - ๋ ธ๋์ ๊ฐ์๊ฐ ์ ํํ 2^K-1 (K๋ ํธ๋ฆฌ์ ๋์ด) ๊ฐ 
๐ซง ์ด์ง ํ์
์ฒ์์ N๊ฐ ํฌ๊ธฐ์ ๋ฐฐ์ด์์ ๋จ๊ณ๊ฐ ํ๋์ฉ ์ง๋๊ฐ์ ๋ฐ๋ผ ํ์ํ ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ ๋ฐ์ฉ ์ค์ด๋ค๊ธฐ ๋๋ฌธ
๐ซง (์ ์๊ฐ ์ ๋ ฌ๋ ๋ฐฐ์ด์์) ์ด์ง ํ์
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int BSearch(int arr[], int target) {
    int low = 0;
    int high = arr.length - 1;
    int mid;
    while(low <= high) {
        mid = (low + high) / 2;
        if (arr[mid] == target)
            return mid;
        else if (arr[mid] > target)
            high = mid - 1;
        else
            low = mid + 1;
    }
    return -1;
}
๐ซง ์ฌ๊ท๋ฅผ ์ฌ์ฉํ ์ด์ง ํ์
1
2
3
4
5
6
7
8
9
10
11
12
int BSearchRecursive(int arr[], int target, int low, int high) {
    if (low > high)
        return -1;
    int mid = (low + high) / 2;
    if (arr[mid] == target)
        return mid;
    else if (arr[mid] > target)
        return BSearchRecursive(arr, target, low, mid-1);
    else
        return BSearchRecursive(arr, target, mid+1, high);
}
๐ซง ๋นํธ ์กฐ์
- : 0s ๋ ๋ชจ๋ ๋นํธ๊ฐ 0 ์ธ ๊ฐ
- 1s ๋ ๋ชจ๋ ๋นํธ๊ฐ 1 ์ธ ๊ฐ - ์ฐ์ฐ๋ค์ด ๋นํธ ๋จ์๋ก ์ด๋ฃจ์ด ์ง๋ค! - ํ ๋นํธ์์ ์ผ์ด๋๋ ์ผ์ด ๋ค๋ฅธ ๋นํธ์ ์ด๋ค ์ํฅ๋ ๋ฏธ์น์ง ์๋๋ค 
๐ซง 2์ ๋ณด์์ ์์
- : ์ปดํจํฐ๋ ์ผ๋ฐ์ ์ผ๋ก ์ ์๋ฅผ ์ ์ฅํ ๋ 2์ ๋ณด์ ํํ๋ก ์ ์ฅ
- ์์๋ฅผ ํํํ ๋ ๋ฌธ์  ์์ - ์์๋ฅผ ํํํ ๋ ๊ทธ ์์ ์ ๋๊ฐ์ ๋ถํธ๋นํธ๋ฅผ 1๋ก ์ธํ ํ ๋ค 2์ ๋ณด์๋ฅผ ์ทจํ ํํ๋ก ํํํจ - N๋นํธ ์ซ์์ ๋ํ 2์ ๋ณด์๋ 2^N ์ ๋ํ ๋ณด์๊ฐ๊ณผ ๊ฐ์ (N์ ๋ถํธ๋นํธ๋ฅผ ๋บ ๋๋จธ์ง ๊ฐ์ ํํํ ๋ ์ฌ์ฉ๋๋ ๋นํธ์ ๊ฐ์) - 2์ ๋ณด์๋ฅผ ํํํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์์๋ก ํํ๋ 2์ง์๋ฅผ ๋ค์ง์ ๋ค 1์ ๋ํด ์ฃผ๋ ๊ฒ 
๐ซง ์ฐ์ ์ฐ์ธก ์ํํธ 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 % (1 << i)) != );
}
- ๐งก ๋นํธ๊ฐ ์ฑ์๋ฃ๊ธฐ
- 1์ i๋นํธ๋งํผ ์ํํธํด์ 00010000์ ๊ฐ์ ๊ฐ ๋ง๋ค๊ธฐ - OR ์ฐ์ฐ์ ํตํด num์ i๋ฒ์งธ ๋นํธ๊ฐ ๋ฐ๊พธ๊ธฐ - i๋ฒ์งธ๋ฅผ ์ ์ธํ ๋๋จธ์ง ๋นํธ๋ค์ 0๊ณผ OR ์ฐ์ฐ์ ํ๋ฏ๋ก num์ ์ํฅ ์์ 
1
2
3
int setBit(int num, int i) {
    return num | (1 << i);
}
- ๐ ๋นํธ๊ฐ ์ญ์ ํ๊ธฐ
- NOT ์ฐ์ฐ์๋ฅผ ์ด์ฉํด 00010000 ์ 11101111 ์ ๊ฐ์ด ๋ง๋ ๋ค num๊ณผ AND ์ฐ์ฐ - ๋๋จธ์ง ๋นํธ์ ๊ฐ์ ๋ณํ์ง ์์ ์ฑ i ๋ฒ์งธ ๋นํธ๊ฐ๋ง ์ญ์ ๋จ 
1
2
3
4
int clearBit(int num, int i) {
	int mask = ~(1 << i);
	return num & mask;
}
- : ์ต์์ ๋นํธ์์ i๋ฒ์งธ ๋นํธ๊น์ง ๋ชจ๋ ์ญ์ ํ๋ ค๋ฉด (1 ยซย i) ๋ก i๋ฒ์งธ ๋นํธ๋ฅผ 1๋ก ์ธํ ํ ๋ค ์ด ๊ฐ์์ 1์ ๋บ๋ค
- i๋ฒ์งธ ๋นํธ ๋ฐ์ ๋ชจ๋ 1๋ก ์ธํ ๋๊ณ ๊ทธ ์๋ก๋ ๋ชจ๋ 0์ผ๋ก ์ธํ - mask ๊ฐ๊ณผ num์ AND ์ฐ์ฐํ๋ค๋ฉด ํ์ 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 clearBitsIthrough0(int num, int i) {
	int mask = (-1 << (i + 1));
	return num & mask;
}
- ๐ ๋นํธ๊ฐ ๋ฐ๊พธ๊ธฐ
- i๋ฒ์งธ ๋นํธ๊ฐ์ v๋ก ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด, ์ฐ์ 11101111์ ๊ฐ์ ๊ฐ์ ์ด์ฉํด i๋ฒ์งธ ๋นํธ๊ฐ์ ์ญ์ ํด์ผ ํจ - ๋ฐ๊พธ๊ณ ์ ํ๋ ๊ฐ v๋ฅผ ์ผ์ชฝ์ผ๋ก i๋ฒ ์ํํธ ํ๋ค - i๋ฒ์งธ ๋นํธ๊ฐ์ v๊ฐ ๋ ๊ฒ์ด๊ณ ๋๋จธ์ง๋ ๋ชจ๋ 0์ด ๋ ๊ฒ์ด๋ค - ๋ง์ง๋ง์ผ๋ก OR ์ฐ์ฐ์ ์ด์ฉํด 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);
}
๐ซง 2์ ๋ณด์, ์์
: ์ปดํจํฐ๊ฐ ์ ์๋ฅผ ์ ์ฅํ ๋๋ ๋๋ถ๋ถ 2์ ๋ณด์ ํํ๋ก ์ ์ฅ
 
- ์์๋ฅผ ๋ํ๋ด๊ธฐ ์ํด์๋ ๊ธฐ์กด์ ์์์ ๋นํธ๋ฅผ ๋ค์ง์ ๋ค์(1์ ๋ณด์) 1์ ๋ํด์ฃผ๋ฉด ๋๋๋ฐ, ์ด๋ ๊ธฐ์กด์ ์๋ฅผ 2์ ๋ณด์ ํํ์ ์ด์ฉํด์ ์์๋ก ๋ํ๋ธ ๊ฒ 
๐ซง ์ฐ์ ์ํํธ, ๋ ผ๋ฆฌ ์ํํธ
: ๋นํธ๋ฅผ 1bit์ฉ ๋ฐ๋ฉด์ ์๊ธด ๋น์๋ฆฌ์ ์๋ก์ด bit๋ฅผ ์ฑ์์ฃผ๋ ์ฐ์ฐ
- ์ฐ์  ์ํํธ ์ฐ์ฐ- ๋ถํธ๋นํธ๋ฅผ ๊ทธ๋๋ก ์ฑ์์ค๋ค
- ๊ธฐ๋ณธ์ ์ผ๋ก 2๋ก ๋๋๊ฑฐ๋ ๊ณฑํ ๊ฒฐ๊ณผ์ ๊ฐ๋ค
 
- ๋
ผ๋ฆฌ ์ํํธ ์ฐ์ฐ- ๋ถํธ๋นํธ์ 0์ ์ฑ์์ค๋ค
- ์ฐ์ ์ ์ผ๋ก๋ ๊ฑฐ์ ๊ด๊ณ๊ฐ ์๋ ๊ฒ์ฒ๋ผ ์ซ์๊ฐ ๋ณํ
 
๐ซง ๊ธฐ๋ณธ ์ฐ์ฐ
- NOT [~] : 1์ด๋ฉด 0, 0์ด๋ฉด 1
- OR [ - |] : ๋ ๊ฐ ์ค 1์ด ํ๋๋ผ๋ ์๋ค๋ฉด 1, ์๋๋ฉด 0- ํฉ์งํฉ ๊ฐ๋ ๊ณผ ์ ์ฌํ๋ค. 
- XOR [ - ^] : ๋ ๊ฐ์ด ๋ค๋ฅด๋ฉด 1, ๊ฐ์ผ๋ฉด 0- ์ค์ ๋ก๋ XOR์ ๋ค์ด๊ฐ๋ ๊ฐ ์ค 1์ ๊ฐฏ์๊ฐ ํ์๊ฐ์ด๋ฉด 1 
- AND [ - &] : ๋ ๊ฐ ๋ชจ๋ 1์ด๋ผ๋ฉด 1, ์๋๋ฉด 0- ๊ต์งํฉ ๊ฐ๋ ๊ณผ ์ ์ฌํ๋ค. 
- SHIFT [<<ย>>] : ๋นํธ ๋จ์๋ก ํ ์นธ์ฉ ๋ฏธ๋ ์ฐ์ฐ
๐ซง ํจ์ ๊ตฌํ
- Get : ํน์  ์์น์ ๋นํธ ๊ฐ์ ๊ฐ์ ธ์จ๋ค.
- Set : ํน์  ์์น์ ๋นํธ ๊ฐ์ ์ธํ ํ๋ค.
- Count : ์ธํ ๋ ๋นํธ ๊ฐ์ด ๋ช ๊ฐ์ธ์ง ๋ฐํํ๋ค.
- Clear : ๋นํธ๋ฅผ 0์ผ๋ก ์ด๊ธฐํ ํ๋ค.
- Toggle : ๋นํธ๋ฅผ ๋ฐ์ ์ํจ๋ค.
- MSB : ์ต์์ ๋นํธ๋ฅผ ์ฐพ๋๋ค.
- LSB : ์ตํ์ ๋นํธ๋ฅผ ์ฐพ๋๋ค.
๐ซง ๋นํธ๋ง์คํฌ(BitMask)
- : ์ฌ๋ฌ ํํ ์ ๋นํธ๋ฅผ ์ด์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ค์ด๊ณ ํจ์จ์ ์ผ๋ก ํํํ ์ ์๋ค
- ex) ์งํฉ {1,2,3,5}๊ฐ ์์ ๋ 11101๋ก ๋ํ๋ผ ์ ์๊ณ ์ ์ฅํ ๋๋ 10์ง์๋ก 29๋ฅผ ์ ์ฅํ๋ฉด ๋๋ค - ๋ฐฐ์ด์ ์ด์ฉํ ํ์์์ด ์ ์ ํ๋๋ง์ผ๋ก ์ ์ฅ์ด ๊ฐ๋ฅํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ค์ผ ์ ์๋ค 






