- 우리가 기본 자료형 배울 때 비트와 바이트 개념을 봤습니다.
- 잘 기억이 안나시는 분들은 아래 주소를 클릭해 주세요.
https://ossam5.tistory.com/615?category=1196505
- 여태까지 배웠던 연산자들은 변수나 상수에 대한 연산이었습니다.
- 이번에는 비트 값을 기반으로 하는 연산자를 소개하겠습니다.
- 비트연산자는 비트단위로 연산이 이루어지는 연산자입니다.
- 비트단위의 연산을 하는 예시 경우를 보겠습니다.
- 암호화작업처럼 임의의 숫자를 만드는 경우
- 어떤 변수의 특정 비트를 꺼내보는 마스킹(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
## &연산자 실습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로 잘 처리되는 것을 확인할 수 있습니다.
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. 연산자 우선 순위
- 지금까지 우리가 배운 모든 연산자에는 우선순위가 있습니다.
- 우선순위에 따라 컴퓨터가 연산을 수행하고, 그 결과가 달라지기 때문에 우선순위를 이해해야 합니다.
- 연산자의 일반적인 우선순위는 다음과 같습니다.
- 일항연산자 > 이항연산자 > 삼항연산자 - 항이 작을수록 높습니다.
- 대입연산자의 우선순위가 가장 낮습니다.
- 산술, 관계, 논리, 대입 연산자 순으로 우선순위를 가집니다.
- ( )를 사용하면 연산이 우선적으로 처리가 됩니다.
우선순위 | 형 | 연산자 | 연산 방향 |
높음 | 일차식 | () [] . | → |
| | | | ↓ |
단항 | ! ++ -- + - | ← |
산술 | % / * | → | |
산술 | + - | → | |
비트이동 | << >> | → | |
관계 | < > >= <= | → | |
관계 | == != | → | |
비트 곱 | & | → | |
비트 차 | ^ | → | |
비트 합 | | | → | |
논리 곱 | && | → | |
논리 합 | || | → | |
삼항(조건) | ? : | → | |
낮음 | 대입 | = += -= *= /= %/ /= | ← |
'컴퓨터언어 > JAVA(자바)' 카테고리의 다른 글
[JAVA강좌] 16강 조건문 - switch문 (0) | 2024.01.11 |
---|---|
[JAVA강좌] 15강 조건문 if문 (0) | 2024.01.11 |
[JAVA강좌] 13강 삼항연산자(조건처리연산자) (0) | 2024.01.10 |
[JAVA강좌] 12강 관계연산자와 논리연산자 (0) | 2024.01.10 |
[JAVA강좌] 11강 복합대입연산자와 증감연산자 (0) | 2024.01.10 |