Language/JAVA

3주차 과제 : 비트 연산자

비트 연산자

비트 연산자는 데이터를 비트(bit) 단위로 연산하기 때문에 0과 1로 표현 가능한 정수 타입만 비트 연산을 할 수 있다.

 

비트 논리 연산자 (&, |, ^)

구분 연산식 결과 설명
AND
(논리곱)
1 & 1 1 두 비트 모두 1 일때
연산 결과 1
1 0 0
0 1 0
0 0 0
OR
(논리합)
1 | 1 1 두 비트 중 하나만 1일때
연산 결과 1
1 0 1
0 1 1
0 0 0
XOR
(배타적 논리합)
1 ^ 1 0 두 비트중 하나는 1이고 다른 하나가 0일 경우 연산결과 1
1 0 1
0 1 1
0 0 0
NOT
(논리 부정)
  ~ 1 0 보수
  0 1

 

비트 이동 연산자 (<<, >>, >>>)

구분 연산식 설명
이동(쉬프트) a << b 정수 a의 각 비트를 b만큼 왼쪽으로 이동(빈자리는 0으로 채워진다.)
a >> b 정수 a의 각 비트를 b만큼 오른쪽으로 이동(빈자리는 정수 a의 최상위 부호 비트(MSB)와 같은 값으로 채워진다.
a >>> b 정수 a의 각 비트를 b만큼 오른쪽으로 이동 (빈자리는 0으로 채워진다.)

 

비트 연산자를 이용한 2진수 덧셈

public static void main(String[] args) {
        System.out.println(addBinaryPlus("1101","1011"));
        System.out.println(addBinaryNonPlus("1101","1011"));
    }

    //일반적인 덧셈연산
    public static String addBinaryPlus(String a, String b) {

        int aInt = Integer.parseInt(a, 2);
        int bInt = Integer.parseInt(b, 2);
        int sum = aInt + bInt;

        return Integer.toBinaryString(sum);
        
        //숫자가 커진다면 다음과 같이 사용합니다.
        /* 
         BigInteger aInt = new BigInteger(a, 2);
         BigInteger bInt = new BigInteger(b, 2);

         BigInteger sum = aInt.add(bInt);

         return sum.toString(2);
        */
    }

    //비트연산으로 덧셈 (최초 매개변수가 String 이라고 가정했을때)
    public static String addBinaryNonPlus(String a, String b) {

        int aInt = Integer.parseInt(a, 2);
        int bInt = Integer.parseInt(b, 2);

        return Integer.toBinaryString(addBin(aInt, bInt));
    }
    
    //재귀용 비트연산 함수
    public static int addBin(int a, int b) {
        if(b == 0) return a;
        //1. 두 비트 XOR 연산 : 두 비트가 다르면 1, 같으면 0
        //즉, 1+0, 0+1은 = 1이고 1+1, 0+0은 0이므로 두 비트의 올림수를 제외하고 덧셈을 할 수 있다.
        int sum = a^b;

        //2. AND 연산 : 두 비트가 모두 1이면 1 (==두 비트가 같을때)
        //1 + 1 의 비트는 올림수가 되므로 왼쪽으로 1 시프트 연산 (<<)
        int carry = (a&b) << 1;

        return addBin(sum, carry);
    }
 }

 


reference by

 

https://kplog.tistory.com/274

 

[알고리즘] 4. 비트연산으로 2진수 덧셈 (XOR, AND, Shift, Binary Add)

분명히 공부했는데 분명히 본 적이 있는데 하면서 먼지쌓인 정보처리기사 책을 펼쳤더니 "그래 이거였어! 생각난다" 가 아니라 "내가 이걸 공부해서 합격했었다고..??!!"라는 충격을 먹은 적.. 없

kplog.tistory.com