[Java] 2.2.4 비트 연산

2.2.4 비트 연산

비트 연산은 비트 단위로 논리 연산을 수행하는 연산입니다.

비트 연산에는 비트 논리곱(&), 비트 논리합(|), 비트 상호 배제(^), 비트 부정(~)이 있습니다. 이 때 특정 자리의 비트가 1이면 참으로 취급하고 0이면 거짓으로 취급합니다.

비트 논리곱(&)은 비트 단위로 논리곱 연산을 합니다. 예를 들어 6&5를 하면 6은 이진수로 110, 5는 이진수로 101 이므로 6&5의 연산 결과는 이진수 100로 10진수 4입니다.

비트 논리합(|)은 비트 단위로 논리합 연산을 합니다. 예를 들어 6|5의 연산 결과는 이진수 111로 10진수 7입니다.

비트 상호 배제(^)는 둘이 같은 값이면 거짓이고 다른 값이면 참입니다. 예를 들어 6^5의 연산 결과는 이진수 011로 10진수 3입니다.

비트 부정(~)은 단항 연산으로 0인 자리는 1로 1인 자리는 0으로 바꿉니다. 즉 1진 보수를 취한 값입니다. 예를 들어 ~6를 수행하면 6은 이진수로 000…110으로 1진 보수를 취하면 111…001입니다. 이는 2진 보수 표기 방식에 의해 10진수 -7을 의미합니다.

private static void exBitLogical() {
    System.out.println("6&5 :"+(6&5));
    System.out.println("6|5 :"+(6|5));
    System.out.println("6^5 :"+(6^5));
    System.out.println("~6 :"+(~6));        
}
6&5 :4
6|5 :7
6^5 :3
~6 :-7

참고로 어떤 수에 같은 수로 ^ 연산을 두 번 하면 원래 수가 되는 특징이 있어 간단한 보안에 사용할 수 있습니다. 이처럼 같은 키로 암호화와 복호화[1]에 사용하는 것을 대칭형 암호화라 합니다.

[1] 복호화란 암호화 상태의 데이터를 원래 데이터로 바꾸는 과정을 말합니다.

private static void exExclusive() {
    int original = 0x12345678; //원본 데이터
    int cryptograph = 0;  //암호화 데이터
    int decrypt = 0;        //복화화 데이터
    int key = 0x394A38C9;       //암호화와 복호화에 사용할 키
    System.out.println("원본 데이터: "+original);
    cryptograph = original ^ key; //암호화
    System.out.println("암호화 데이터: "+cryptograph);
    decrypt = cryptograph ^ key; //복호화
    System.out.println("복호화 데이터: "+decrypt);        
}
원본 데이터: 305419896
암호화 데이터: 729706161
복호화 데이터: 305419896