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