์ ๋ณด์ฒ๋ฆฌ๊ธฐ๋ฅ์ฌ 17.์ฐ์ฐ
๋นํธ ์ฐ์ฐ์ (Bitwise Operators) ์ ๋ฆฌ
1. AND ์ฐ์ฐ (&) - ๋ง์คํน (Masking)
AND ์ฐ์ฐ์ ํน์ ๋ฌธ์๋ ๋นํธ๋ฅผ ์ญ์ (Clear)ํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, ๋ง์คํน ์ฐ์ฐ์ด๋ผ๊ณ ๋ ํฉ๋๋ค. ์ญ์ ํ ๋ถ๋ถ์ ๋นํธ๋ฅผ 0๊ณผ AND ์ฐ์ฐํ๋ฉด ํด๋น ๋นํธ๊ฐ 0์ด ๋์ด ์ญ์ ๋ฉ๋๋ค.
์์ :
int a = 0b1101; // 13 (2์ง์)
int mask = 0b1010; // ๋ง์คํฌ ๊ฐ
int result = a & mask; // 0b1000 (8)
2. OR ์ฐ์ฐ (|) - ์ ํ์ ์ธํธ (Selective Set)
OR ์ฐ์ฐ์ ํน์ ๋ฌธ์๋ฅผ ์ฝ์ ํ๊ฑฐ๋ ๋นํธ๋ฅผ 1๋ก ์ค์ (Set)ํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, ์ ํ์ ์ธํธ ์ฐ์ฐ์ด๋ผ๊ณ ๋ ํฉ๋๋ค. ์ํ๋ ์์น์ ๋นํธ๋ฅผ 1๋ก ๋ง๋ค๊ธฐ ์ํด OR ์ฐ์ฐ์ ์ํํฉ๋๋ค.
์์ :
int a = 0b1100; // 12
int mask = 0b0011;
int result = a | mask; // 0b1111 (15)
3. XOR ์ฐ์ฐ (^) - ๋น๊ต ๋ฐ ๋ฐ์ (Toggle)
XOR ์ฐ์ฐ์ ๋ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋น๊ตํ๊ฑฐ๋ ํน์ ๋นํธ๋ฅผ ๋ฐ์ (Toggle)ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ๋น๊ต: XOR ์ฐ์ฐ ๊ฒฐ๊ณผ๊ฐ 0์ด๋ฉด ๋์ผํ ๋ฐ์ดํฐ, 1์ด ํฌํจ๋์ด ์์ผ๋ฉด ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ์ ๋๋ค.
- ๋นํธ ๋ฐ์ : ํน์ ๋นํธ๋ฅผ ๋ฐ์ ์ํค๋ ค๋ฉด XOR ์ฐ์ฐ์ ์ฌ์ฉํฉ๋๋ค.
์์ :
int a = 0b1101;
int b = 0b1011;
int result = a ^ b; // 0b0110 (6, ์๋ก ๋ค๋ฅธ ๋นํธ ํ์ธ)
// ํน์ ๋นํธ ๋ฐ์
int c = 0b1100;
int toggle_mask = 0b0100;
int toggled = c ^ toggle_mask; // 0b1000 (๋ฐ์ ๋ ๊ฐ)
4. NOT ์ฐ์ฐ (~) - ๋ณด์ (Complement)
NOT ์ฐ์ฐ์ ๊ฐ ๋นํธ๋ฅผ ๋ฐ์ ์์ผ ๋ณด์๋ฅผ ๊ตฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ชจ๋ 0์ 1๋ก, 1์ 0์ผ๋ก ๋ฐ๊ฟ๋๋ค.
์์ :
int a = 0b00001111;
int result = ~a; // 0b11110000 (๋ณด์ ์ฐ์ฐ)
5. ๋นํธ ์ด๋ (Shift & Rotate)
๋ ผ๋ฆฌ ์ํํธ (Logical Shift)
๋ ผ๋ฆฌ ์ํํธ๋ ๋นํธ๋ฅผ ๋จ์ํ ์ผ์ชฝ(<<) ๋๋ ์ค๋ฅธ์ชฝ(>>)์ผ๋ก ์ด๋์ํค๋ฉฐ, ๋น ์๋ฆฌ๋ 0์ผ๋ก ์ฑ์์ง๋๋ค.
์์ :
int a = 0b00001111; // 15
int leftShift = a << 2; // 0b00111100 (60)
int rightShift = a >> 2; // 0b00000011 (3)
์ฐ์ ์ํํธ (Arithmetic Shift)
์ฐ์ ์ํํธ๋ ๋ถํธ ๋นํธ๋ฅผ ์ ์งํ๋ฉด์ ์ด๋ํ๋ ๋ฐฉ์์ผ๋ก, ์ค๋ฅธ์ชฝ ์ํํธ ์ ๋ถํธ ๋นํธ(1 ๋๋ 0)๊ฐ ์ ์ง๋ฉ๋๋ค.
์์ :
int a = -8; // 0b11111000 (8๋นํธ ๊ธฐ์ค)
int arithmeticRightShift = a >> 2; // 0b11111110 (-2)
ํ์ ์ด๋ (Rotate Move)
ํ์ ์ด๋์ ๋นํธ๋ฅผ ์ด๋ํ ํ, ๋ฐ๋ ค๋ ๋นํธ๋ฅผ ๋ฐ๋ํธ ๋์ผ๋ก ๋ค์ ์ฑ์ ๋ฃ๋ ๋ฐฉ์์ ๋๋ค.
์์ :
int a = 0b1101; // 13
int rotateLeft = (a << 1) | (a >> 3); // ์ผ์ชฝ ํ์
int rotateRight = (a >> 1) | (a << 3); // ์ค๋ฅธ์ชฝ ํ์