1. 비트 연산자(&, │, ^)
비트 연산자는 피연산자를 비트단위로 논리 연산한다.
│(OR 연산자) : 피연산자 중 한 쪽 값의 값이 1이면 1을 결과로 얻고, 그 외에는 0을 얻는다.
&(AND 연산자) : 피연산자 양 쪽이 모두 1이어야만 1을 결과로 얻고, 그 외에는 0을 얻는다.
^(XOR 연산자) : 피연산자의 값이 서로 다를 때만 1을 결과로 얻고, 같을 때에는 0을 얻는다.
* 피연산자로 실수는 허용하지 않으며, 정수(문자 포함)만 허용한다.
** 연산자 '^'는 배타적 XOR(eXclusive OR)이라 부른다.
System.out.println(7 & 5);
// 111 : 7[10]
// 101 : 5[10]
// 101 : 5[10] << AND의 결과
System.out.println(7 | 5);
// 111 : 7[10]
// 101 : 5[10]
// 111 : 7[10] << OR의 결과
System.out.println(7 ^ 5);
// 111 : 7[10]
// 101 : 5[10]
// 010 : 2[10] << XOR의 결과
System.out.println(8 & 6);
// 1000 << 8[10]
// 0110 << 6[10]
// 0000 << 0[10] << AND의 결과
System.out.println(8 | 6);
// 1000 << 8[10]
// 0110 << 6[10]
// 1110 << 14[10] << OR의 결과
System.out.println(8 ^ 6);
// 1000 << 8[10]
// 0110 << 6[10]
// 1110 << 14[10] << XOR의 결과
2. 비트 전환 연산자(∼)
비트 전환 연산자는 피연산자를 2진수로 표현했을 때, 0은 1로, 1은 0으로 바꾼다.
System.out.print("0000000000"); // 0의 갯수를 맞추기 위해 입력
System.out.print("0000000000");
System.out.print("000000000");
System.out.println(Integer.toBinaryString(7)); // 00000000000000000000000000000111
System.out.println(Integer.toBinaryString(~7)); // 11111111111111111111111111111000
비트 전환 연산자에 의해 '비트 전환'이 되면, 부호있는 타입의 피연산자는 부호가 반대로 변경된다. 그래서 비트전환 연산자를 '1의 보수' 연산자라고도 한다.
3. 쉬프트 연산자(<<, >>)
쉬프트 연산자는 피연산자의 각 자리(2진수로 표현했을 때)를 '오른쪽(>>)' 또는 '왼쪽(<<)'으로 이동한다. 자리이동으로 저장범위를 벗어난 값들은 버려지고, 빈자리는 0으로 채워진다.
x<<n은 x*2ⁿ의 결과와 같다.
x>>n은 x/2ⁿ의 결과와 같다.
System.out.println(7 << 3); // 00111000[2] : 56[10] 7*2^3
System.out.println(7 << 2); // 00011100[2] : 28[10] 7*2^2
System.out.println(7 << 1); // 00001110[2] : 14[10] 7*2^1
System.out.println(7 << 0); // 00000111[2] : 7[10] 7*2^0
System.out.println(7 >> 0); // 00000111[2] : 7[10]
System.out.println(7 >> 1); // 00000011[2] : 5[10]
System.out.println(7 >> 2); // 00000001[2] : 1[10]
System.out.println(7 >> 3); // 00000000[2] : 0
- 부호무시 쉬프트 연산자(>>>)
System.out.println(Integer.toBinaryString(-1024)); // 11111111111111111111110000000000
System.out.println(Integer.toBinaryString(-1024 >> 1)); // 11111111111111111111111000000000
System.out.println(Integer.toBinaryString(-1024 >>> 1)); // 1111111111111111111111000000000
System.out.println(-1024 >> 1); > -512
System.out.println(-1024 >>> 1);// 부호무시 쉬프트 연산 > 2147483136
참고문헌 : 남궁성(2016), Java의 정석, 도우출판