Software Engineering/Java, JSP

[Java] 비트 연산자(Bitwise Operators) 정리

iseop 2023. 5. 25. 15:42   인쇄용 버전

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에서 부호를 고려하지 않는 왼쪽 시프트 연산은 지원하지 않는다.