본문 바로가기

Language/Java

[Java] 비트 연산자

비트 연산자 : 비트 단위로 연산이 이루어지는 연산자

 

비트단위 연산을 하는 경우 

  • '암호화' 작업처럼 임의의 숫자를 만들 때
  • 어떤 변수의 특정 비트를 꺼내보는 경우(마스킹 : masking)
  • 하드웨어에 내장되는 임베디드 시스템 프로그램에서 메모리 용량이 부족하거나 계산이 복잡해 속도가 느려질 때

 

 

비트 논리 연산자

 

 & 연산자 

&(AND) 연산자는 두 개의 비트 값이 모두 1인 경우에만 연산의 결과 값이 1이 된다.

int num1 = 5;
int num2 = 10;
int result = num1 & num2;
     num1 : 0 0 0 0 0 1 0 1
   & num2 : 0 0 0 0 1 0 1 0
 ----------------------------
   result : 0 0 0 0 0 0 0 0

5와 10을 & 연산하면 결과 값은 0이 된다.

 

 

 | 연산자  

|(OR) 연산자는 비트 값이 하나라도 1이면 연산 결과 값이 1이 된다.

int num1 = 5;
int num2 = 10;
int result = num1 | num2;
     num1 : 0 0 0 0 0 1 0 1
   | num2 : 0 0 0 0 1 0 1 0
 ----------------------------
   result : 0 0 0 0 1 1 1 1

5와 10을 | 연산하면 결과는 2진수로 00001111이다. 이 값을 10진수로 변환하면 15가 나온다.

 

 

  ^ 연산자  

^(XOR) 연산자는 같은 값이면 0, 다른 값이면 1의 결과 값을 갖는다.

int num1 = 5;
int num2 = 10;
int result = num1 ^ num2;
     num1 : 0 0 0 0 0 1 0 1
   ^ num2 : 0 0 0 0 1 0 1 0
 ----------------------------
   result : 0 0 0 0 1 1 1 1

 

 

  ~ 연산자  

~(반전) 연산자는 비트 값을 0은 1로, 1은 0으로 바꾸는 연산자이다. 그래서 반전 연산자라고도 한다.

int num = 10;
int result = ~num;
     num : 0 0 0 0 1 0 1 0 
 ----------------------------
   ~ num : 1 1 1 1 0 1 0 1

위의 경우는 부호 비트가 1로 바뀌었기 때문에 음수이다.

2진수 11110101을 10진수로 변환하면 11이 되어, ~num 값은 -11이다.

 

 

 

 

 

비트 이동 연산자

시프트(shift) 연산자라고도 한다.

 

  << 연산자  

<< 시프트 연산자는 왼쪽으로 비트를 이동하는 연산자이다.

int num = 5;
num << 2;
  num      : 0 0 0 0 0 1 0 1 
  num << 2 : 0 0 0 1 0 1 0 0

00000101을 두 비트만큼 왼쪽으로 이동, 이때 앞 두 자리 비트 00은 없어지고 뒷부분은 0으로 채워진다.

왼쪽으로 n비트 이동한다는 것은 기존 값에 2ⁿ만큼 곱한다는 뜻

왼쪽으로 2비트 이동한 00000101은 5 * 2² = 20, 즉 값 20이 된다.

 

 

  >> 연산자  

>> 시프트 연산자는 오른쪽으로 비트를 이동하는 연산자이다.

int num = 10;
num >> 2;
  num      : 0 0 0 0 1 0 1 0 
  num >> 2 : 0 0 0 0 0 0 1 0

오른쪽으로 n비트 이동하면 기존 값을 2ⁿ만큼 나눈다.

위의 경우 10 / 2² 이 되므로 결과 값은 2가 된다.

왼쪽에 채워지는 비트 값은 기존 값의 부호 비트와 동일하다.

 

 

  >>> 연산자  

>>> 시프트 연산자는 >> 연산과 동일하게 비트를 오른쪽으로 이동한다.

차이가 있다면 >>> 연산자는 왼쪽에 채워지는 비트 값이 부호 비트와 상관없이 무조건 0이 된다.

 

[실습] 비트 이동 연산자를 사용하여 연산하기
package operator;

public class OperationEx5 {
	public static void main(String[] args) {
		int num = 0B00000101;  //5를 8비트 2진수로 나타냄
		
		System.out.println(num << 2);   //왼쪽으로 2비트 이동 00010100 (20)
		System.out.println(num >> 2);   //오른쪽으로 2비트 이동 00000001 (1)
		System.out.println(num >>> 2);  //오른쪽으로 2비트 이동 00000001 (1)
		
		System.out.println(num);  //num에 값을 대입하지 않아 비트 이동과 관계없이 기존 값 출력
		
		num = num << 2;  //왼쪽으로 2비트 이동한 값을 다시 num에 대입
		System.out.println(num);
	}
}

위의 실습내용에서 중요한 것은 비트를 이동했다 해서 num값이 바로 바뀌는 게 아니다는 것

왜냐하면 num값을 참조해서 이동했을 뿐, 이동한 값을 대입하지 않았기 때문

 

 

 

 

연산자 우선순위

● 단항 연산자가 가장 높고 이항, 삼항 연산자 순서이다
● 대입 연산자의 우선순위가 가장 낮다
● 산술, 관계, 논리, 대입 연산자 순서로 우선순위를 가지며, ()의 우선순위가 가장 높다
우선순위 연산자 연산방향
1 일차식 () [] .
2 단항 ! ++ -- + -
3 산술 % /
4 산술 + -
5 비트이동 << >>
6 관계 < > <= >=
7 관계 == !=
8 비트 곱 &
9 비트 차 ^
10 비트 합 |
11 논리 곱 &&
12 논리 합 ||
13 조건 ? :
14 대입 = += -= *= %= /=

 

 

 

https://github.com/hyunjin1292/Java_study

 

GitHub - hyunjin1292/Java_study: java study book practice example

java study book practice example. Contribute to hyunjin1292/Java_study development by creating an account on GitHub.

github.com


※ 이지스퍼블리싱의 'Do it! 자바 프로그래밍 입문' 책을 보고 공부한 내용을 정리하고 있습니다.

'Language > Java' 카테고리의 다른 글

[Java] 반복문  (0) 2022.09.20
[Java] 조건문  (0) 2022.08.12
[Java] 기본 연산자  (0) 2022.08.08
[Java] 형 변환  (0) 2022.07.22
[Java] 상수와 리터럴  (0) 2022.07.20