1. 논리곱(AND) &
입력 비트가 모두 1인 경우 출력이 1인 연산
byte a = 10; // 1010
byte b = a & 2;
// 00001010
// 00000010
// 00000010
System.out.println(b); // 2
2. 논리합(OR) |
입력 비트 중 한 개 이상이 1인 경우 출력이 1인 연산
byte a = 10; // 1010
byte b = a | 2;
// 00001010
// 00000010
// 00001010
System.out.println(b); // 10
3. 배타적 논리합(eXclusive OR) ^
두 입력이 서로 다른 경우 출력이 1인 연산
byte a = 10; // 1010
byte b = a ^ 2;
// 00001010
// 00000010
// 00001000
System.out.println(b); // 8
4. 보수(compliment) ~
1을 0으로, 0을 1로 변환
byte a = 10; // 00001010
byte b = ~a; // 11110101
System.out.println(b); // 245
5. 시프트(bit shift) 연산
5.1. 부호고려 오른쪽 시프트(signed right shift) >>
가장 큰(가장 왼쪽) 비트(Most Significant Bit)를 그대로 두고, 나머지 비트를 오른쪽으로 옮기는 연산(2^n배 작아짐)
byte a = -10; // 10001010
byte b = a >> 3; // 10000001
System.out.println(b); // -1
5.2. 부호고려 왼쪽 시프트(signed left shift) <<
MSB를 그대로 두고, 나머지 비트를 왼쪽으로 옮기는 연산(2^n배 커짐)
byte a = -10; // 10001010
byte b = a << 3; // 11010000
5.3. 부호무시 오른쪽 시프트(unsigned right shift) >>>
모든 비트를 오른쪽으로 옮기는 연산
byte a = -10; // 10001010
byte b = a >>> 3; // 00010001
System.out.println(b); // 17
* Java에서 부호를 고려하지 않는 왼쪽 시프트 연산은 지원하지 않는다.