본문 바로가기

컴퓨터언어/JAVA(자바)

[JAVA강좌] 14강 비트연산자와 연산자우선순위

728x90
반응형

 

 

 

 

 

 

 

 

- 우리가 기본 자료형 배울 때 비트와 바이트 개념을 봤습니다.

- 잘 기억이 안나시는 분들은 아래 주소를 클릭해 주세요.

https://ossam5.tistory.com/615?category=1196505

 

[JAVA강좌] 3강 기본자료형 - 정수관련 - byte, short, int, long

- 이번 강좌에서는 기본 자료형 중 정수 관련을 보도록 하겠습니다. - 1강 변수 선언에서도 자료형 종류를 볼 때 바이트라는 개념을 적어드렸는데, 개념을 먼저 잡고 공부해 주세요. 정수형 문자

ossam5.tistory.com

 

- 여태까지 배웠던 연산자들은 변수나 상수에 대한 연산이었습니다.

- 이번에는 비트 값을 기반으로 하는 연산자를 소개하겠습니다. 

- 비트연산자는 비트단위로 연산이 이루어지는 연산자입니다.

- 비트단위의 연산을 하는 예시 경우를 보겠습니다.

  • 암호화작업처럼 임의의 숫자를 만드는 경우
  • 어떤 변수의 특정 비트를 꺼내보는 마스킹(masking)을 하는 경우
  • 하드웨어에 내장되는 임베디드 시스템 프로그램에서 응용하는 경우

- 이외에도 많이 있지만 이 정도로 마무리하겠습니다.

- 자바에서는 많이 사용하진 않지만, 프로그램에서 특정 값을 만들거나 연산할 때 비트 연산자를 사용합니다.

 

 

 

 

 

 

 

 

 

 

 

1. 비트 논리 연산자


 

 

1) 비트 논리 연산자의 종류

- 비트논리연산자는 변수 또는 값을 비트로 나열한 후 각 비트별로 논리 연산을 합니다.

연산자 설명 예시
& 여러 개의 비트 값이 모두 1인 경우에만 연산의 결과값이 1로 처리(AND) num1 & num2
| 여러 비트 값 중 하나라도 1이면 연산 결과값이 1로 처리(OR) num1 | num2
^ 같은 값이면 0, 다른 값이면 1의 결과 값으로 처리(XOR) num1 ^ num2
~ 반전 연산자로 비트값이 0이면 1로, 1이면 0으로 처리 ~num

- 비트값이기 때문에 정수로 입력 시 이진법으로 변경돼서 처리된다고 보면 됩니다. 

- 예를 들어 10진법 5는 00000101로 원래는 101인데 간단히 8비트로 앞에 0을 더 붙였습니다.

- 진법계산기는 많이 있지만 예시로 하나만 추천하겠습니다.

https://www.digikey.kr/ko/resources/conversion-calculators/conversion-calculator-number-conversion

 

 

 


 

 

 

 

2) & 연산자

- &(AND) 연산자는 여러 개의 비트 값이 모두 1인 경우에만 결과값을 1로 처리합니다.

- 앞의 &&와 유사하지만 비트단위로 이루어진다고 보면 됩니다. 

- 정수 5와 10을 8비트의 이진법으로 바꿔서 &연산자처리한다고 보도록 하겠습니다.

 

## 예시

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

- 8개의 비트를 하나씩 연산해서 전부 0으로 처리가 됩니다.

- 그래서 정수로 변경되면 0으로 처리가 됩니다.

- 아래에서는 직접 실습으로 확인해 보겠습니다.

- 패키지(ch10_operator)과 클래스(Ex11_BitOperator1.java)를 추가해 주세요. 

- 기초적 작업을 모르는 분은 아래 주소를 클릭하고 보고 오세요.

https://ossam5.tistory.com/613

 

[JAVA강좌] 1강 JAVA변수와 자료형

1. 프로젝트 패키지 생성 및 자바 파일 생성 - 앞으로의 강좌에서는 패키지 생성 및 자바 파일 생성하는 것을 보여드리진 않겠습니다. - 지금 잘 확인해 주시기 바랍니다. 1) 프로젝트 패키지 생성

ossam5.tistory.com

 

 

 

## &연산자 실습1 - Ex11_BitOperator1.java

package ch10_operator;

public class Ex11_BitOperator1 {

	public static void main(String[] args) {
		int num1 = 5;
		int num2 = 10;

		int result = num1 & num2;
		
		System.out.println(result);
	}

}

- 설명은 위에서 했기 때문에 결과만 보겠습니다.

 

 

## &연산자 결과1 - Ex11_BitOperator1.java

- 그럼 정수 0을 반환하는 것을 확인할 수 있습니다. 

 

 

 


 

 

 

 

3) | 연산자

- |(OR) 연산자는 비트 값이 하나라도 1이면 결과값이 1로 처리됩니다.

- 앞의 ||와 유사하지만 비트단위로 이루어진다고 보면 됩니다. 

- 정수 5와 10을 8비트의 이진법으로 바꿔서 |연산자처리한다고 보도록 하겠습니다.

 

## 예시

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

- 8개의 비트를 하나씩 연산해서 하나라도 1이 있다면 1로 반환됩니다. 

- 그래서 정수로 변경되면 15로 처리가 됩니다.

- 아래에서는 직접 실습으로 확인해 보겠습니다.

 

 

## |연산자 실습1 - Ex11_BitOperator2.java

package ch10_operator;

public class Ex11_BitOperator2 {

	public static void main(String[] args) {
		int num1 = 5;
		int num2 = 10;

		int result = num1 | num2;
		
		System.out.println(result);
	}

}

 

 

## |연산자 결과1 - Ex11_BitOperator2.java

- 그럼 결과가 15로 잘 처리되는 것이 확인됩니다.

 

 


 

 

 

4) ^ 연산자

- ^(XOR) 연산자는 같은 값이면 0, 다른 값이면 1의 결과를 처리합니다.

- 정수 5와 10을 8비트의 이진법으로 바꿔서^연산자처리한다고 보도록 하겠습니다.

 

## 예시

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

- 8개의 비트를 하나씩 연산해서 같은 값이면 0, 다른 값이면 1로 처리가 됩니다.

- 그래서 정수로 변경되면 | 연산자처럼 15로 처리가 됩니다.

- 하지만 항상 같은 것은 아닙니다.

- 아래에서는 직접 실습으로 확인해 보겠습니다.

 

 

 

## ^연산자 실습1 - Ex11_BitOperator3.java

package ch10_operator;

public class Ex11_BitOperator3 {

	public static void main(String[] args) {
		int num1 = 5;
		int num2 = 10;

		int result = num1 ^ num2;
		
		System.out.println(result);
	}

}

 

 

## ^연산자 결과1 - Ex11_BitOperator3.java

- 그럼 결과가 15로 잘 처리되는 것이 확인됩니다.

 

 

 


 

 

 

5) ~ 연산자

- ~ (반전) 연산자는 비트값이 1이면 0으로, 0이면 1로 바꿉니다.

- !와 유사해 보이지만 비트처리에서 이뤄집니다.

- 정수 10을 반전해 보도록 하겠습니다.

 

## 예시

int num = 10;

int result = ~num;

- 이런 코드가 있다고 보겠습니다. 

- ~ 연산자를 사용했기 때문에 비트 연산으로 바뀝니다.

 

 

## 예시 연산과정

  num : 0 0 0 0 1 0 1 0
--------------------------
~ num : 1 1 1 1 0 1 0 1

- 8개의 비트를 전부 반전했습니다.

- 그래서 정수로 변경되면 -11로 처리가 됩니다.

- 부호 비트 부분이 0이면 양수, 1이면 음수였죠? 

- 아래에서는 직접 실습으로 확인해 보겠습니다.

 

 

 

## ~연산자 실습1 - Ex11_BitOperator4.java

package ch10_operator;

public class Ex11_BitOperator4 {

	public static void main(String[] args) {
		int num = 10;

		int result = ~num;
		
		System.out.println(result);
	}

}

 

 

## ~연산자 결과1 - Ex11_BitOperator4.java

- 그럼 결과가 -11로 잘 처리되는 것을 확인할 수 있습니다. 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형

 

 

 

 

 

 

 

 

 

 

 

 

2. 비트 이동 연산자


- 비트 이동연산자는 변수 또는 값을 비트로 이동시키는 연산자입니다.

- 그래서 시프트(Shift) 연산자라고도 합니다. 

 

 

 

 

 

1) 비트 이동 연산자의 종류

연산자 설명 예시
<< 왼쪽으로 비트를 이동하는 연산자 num << 2
>> 오른쪽으로 비트를 이동하는 연산자
부호비트는 기존 값과 동일
num >> 2
>>> >>연산자 처럼 오른쪽으로 이동하는 연산자
부호비트는 무조건 0(양수)로 처리
num >>> 2

- 비트값이기 때문에 정수로 입력 시 이진법으로 변경돼서 처리된다고 보면 됩니다. 

 

 


 

 

 

2) <<연산자

- << 연산자는 왼쪽으로 비트를 이동하는 연산자입니다.

- 정수 5를 2개만큼 이동해 보겠습니다.

 

## 예시

int num = 5;

int result = num << 2;

- 이런 코드가 있다고 보겠습니다. 

- << 연산자를 사용했기 때문에 비트 연산으로 바뀝니다.

 

 

## 예시 연산과정

     num : 0 0 0 0 0 1 0 1
--------------------------
num << 2 : 0 0 0 1 0 1 0 0

- 왼쪽으로 2개가 밀리고 앞자리의 00은 제거됩니다.

- 남는 오른쪽은 0으로 채워줍니다.

- 왼쪽으로 n비트 이동한다는 건 기존 값에 2ⁿ만큼 곱한다는 뜻입니다.

- 그래서 5 * 2² = 20, 즉 20으로 처리가 됩니다.

 

 

 

## <<연산자 실습1 - Ex11_BitOperator5.java

package ch10_operator;

public class Ex11_BitOperator5 {

	public static void main(String[] args) {
		int num = 5;

		int result = num << 2;
		
		System.out.println(result);
	}

}

 

 

 

## <<연산자 결과1 - Ex11_BitOperator5.java

- 그럼 결과가 20으로 잘 나오는 것이 확인됩니다.

 

 

 

 


 

 

 

 

2) >>연산자

- >> 연산자는 오른쪽으로 비트를 이동하는 연산자입니다.

- 부호비트인 첫 번째는 기존 값과 동일하게 적용합니다.

- 정수 10을 2개만큼 이동해 보겠습니다.

 

 

## 예시

int num = 10;

int result = num >> 2;

- 이런 코드가 있다고 보겠습니다. 

- >> 연산자를 사용했기 때문에 비트 연산으로 바뀝니다.

 

 

## 예시 연산과정

     num : 0 0 0 0 1 0 1 0
--------------------------
num >> 2 : 0 0 0 0 0 0 1 0

- 오른쪽으로 2개가 밀리고 뒤자리의 10은 제거됩니다.

- 남는 왼쪽은 0으로 채워줍니다.

- 실제로는 부호비트는 기존 값과 같습니다. 원래 양수여서 0입니다.

- 위의 경우는 10 / 2²으로 처리가 됩니다. 

- 그래서 결과값은 2로 처리가 됩니다.

 

 

 

## >>연산자 실습1 - Ex11_BitOperator6.java

package ch10_operator;

public class Ex11_BitOperator6 {

	public static void main(String[] args) {
		int num = 10;

		int result = num >> 2;
		
		System.out.println(result);
	}

}

 

 

 

## >>연산자 결과1 - Ex11_BitOperator6.java

- 그럼 결과가 2로 잘 나오는 것이 확인됩니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3. 연산자 우선 순위


- 지금까지 우리가 배운 모든 연산자에는 우선순위가 있습니다. 

- 우선순위에 따라 컴퓨터가 연산을 수행하고, 그 결과가 달라지기 때문에 우선순위를 이해해야 합니다.

- 연산자의 일반적인 우선순위는 다음과 같습니다.

  • 일항연산자 > 이항연산자 > 삼항연산자 - 항이 작을수록 높습니다.
  • 대입연산자의 우선순위가 가장 낮습니다.
  • 산술, 관계, 논리, 대입 연산자 순으로 우선순위를 가집니다.
  • ( )를 사용하면 연산이 우선적으로 처리가 됩니다.
우선순위 연산자 연산 방향
높음 일차식 ()   []   .
|
|
|
|
단항 !   ++   --   +   -
산술 %   /   *
산술 +   -
비트이동 <<   >>
관계 <   >   >=   <=
관계 ==   !=
비트 곱 &
비트 차 ^
비트 합 |
논리 곱 &&
논리 합 ||
삼항(조건) ? :
낮음 대입 =   +=   -=   *=   /=   %/   /=

 

 

 

 

 

 

 

728x90
반응형