Search

Bit Operation

{% embed url=“https://youtube.com/watch?v=yHBYeguDR0A&feature=shares” %}

1. 덧셈

십진수 덧셈과 같지만, 2가 넘어갈 경우, 앞자리로 +1 된다.

2. 뺄셈

역시 십진수 뺄샘과 유사하다. 부족할 경우, 앞자리에서 가져온다.

3. 곱셈

십진수 곱셈과 비슷하다. 자리수별로 해주면 된다.
1*1일 때만 1이되고, 나머지 경우는 모두 0이 된다.

4. OR 연산

둘 다 0이면 0이고, 둘 중 하나라도 1이면 1이 된다.
XXXX | 0000 = XXXX
XXXX | 1111 = 1111
XXXX | XXXX = XXXX

5. AND 연산

두개 모두 1이면 1, 나머지 경우는 모두 0 이다.
0011 & 0101 = 0001
XXXX & 0000 = 0000
XXXX & 1111 = XXXX
XXXX & XXXX = XXXX

6. NOT 연산

각 자리 수의 반대 수를 표현한다.
~ 0101 = 1010

7. XOR 연산

두 개가 같다면 0, 다르면 1로 표현한다.
XXXX ^ 0000 = XXXX
XXXX ^ 1111 = ~XXXX
XXXX ^ XXXX = 0000

8. Shift 연산

왼쪽으로 2칸 이동 : 1001 << 2 = 100100
오른쪽으로 2칸 이동 : 1001 >> 2 = 10
Logical Right Shift (부호 무시) :
Arithmatic Right Shift (부호 고려)

8-1. Logical Right Shift : 부호 무시

8-2. Arithmatic Right Shift

9. 실전문제

9-1. 숫자 9의 3번째 인덱스 비트값이 0인지 1인지 확인하시오

9를 이진수로 표현하면, 1001
3번째 인덱스는 1 이다.
이를 구하기 위해서는 아래와 같은 연산을 해야한다.
먼저, 9에서 3번째 인덱스를 제외하고 나머지 숫자를 날릴 수 있는 수를 구한다.
다시 말하자면, 1001 에서 세번째 인덱스 수인 1을 가져오기 위해서 나머지는 다 0으로 만들어야 한다.
즉, 1001 ? XXXX = 1000 이렇게 되어야 하는 수 XXXX와 연산 ? 를 구해야한다.
답은 & 1000 이다. 1001 & 1000 = 1000 이므로.
이제 1000 비트값을 만들어주기 위해서 연산을 만들면, 바로 1 << 3 이 된다.
코드로 표현하면 아래와 같다.
public class BitOperation1 { static boolean getBit(int num, int idx) { return (num & (1 << idx)) != 0; } public static void main(String[] args) { //1 0 0 1 System.out.println(getBit(9, 3)); // 0 1 0 1 System.out.println(getBit(5, 3)); }}
Java
복사

9-2. 숫자 N의 i번째 비트값을 1로 세팅하는 함수

package practice.algorithm.bit;public class SetBit { static int setBit(int num, int idx) { return num | (1 << idx); } public static void main(String[] args) { //1 0 0 1 -> 9 (same) System.out.println(setBit(9, 3)); // 0 1 0 1 -> 13 (changed) System.out.println(setBit(5, 3)); }}
Java
복사

9-3. 숫자 N의 i번째 비트값을 0으로 세팅하는 함수

package practice.algorithm.bit;public class ClearBit { static int clearBit(int num, int idx) { return num & ~(1 << idx); } public static void main(String[] args) { //1 0 0 1 -> 0 0 0 1 = 1 System.out.println(clearBit(9, 3)); // 0 1 0 1 -> 0 1 0 1 = 5 System.out.println(clearBit(5, 3)); }}
Java
복사

9-4. 그밖에

package practice.algorithm.bit;public class ClearLeftBit { static int clearLeftBits(int num, int idx) { return num & ((1 << idx) -1); } public static void main(String[] args) { //1 System.out.println(clearLeftBits(169, 3)); }}package practice.algorithm.bit;public class ClearRightBit { static int clearRightBits(int num, int idx) { return num & (-1 << (idx+1)); } public static void main(String[] args) { //1 System.out.println(clearRightBits(169, 3)); }}package practice.algorithm.bit;public class UpdateBit { static int updateBit(int num, int idx, boolean val) { return num & ~(1 << idx) | ((val? 1:0) << idx); } public static void main(String[] args) { //1 System.out.println(updateBit(169, 3, false)); }}
Java
복사