비트 연산자
1. 비트 연산자
a. 정수나 문자 등을 2진수로 변환한 다음 각 자리의 비트끼리 연산을 수행한다
비트 연산자 | 설명 | 의미 |
& | 비트 논리곱 연산자(AND) | 둘 다 1이면 1 |
| | 비트 논리합 연산자(OR) | 둘 중 하나면 1이면 1 |
^ | 비트 배타적 논리합 연산자(XOR) | 둘이 같으면 0이고, 둘이 다르면 1 |
~ | 비트 부정 연산자 | 1은 0으로 바꾸고, 0은 1로 바꿈 |
<< | 왼쪽 시프트 연산자 | 비트를 왼쪽으로 시프트 |
>> | 오른쪽 시프트 연산자 | 비트를 오른쪽으로 시프트 |
1 - true / 0 - false
2. 비트 논리곱 연산자 &
a. '10 & 7'
ㄱ. 10진수를 2진수로 변환한 다음 각 비트마다 AND 연산을 수행
ㄴ. 결과 - 2진수로는 0010₂, 10진수로는 2
A | B | A&B |
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
public class EX04_09 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.printf(" 10 & 7 = %d \n", 10 & 7); //10과 7의 논리곱을 수행
System.out.printf(" 123 & 456 = %d \n", 123 & 456); //123과 456의 비트 논리곱을 수행
System.out.printf(" 0xFFFF & 0000 = %d \n", 0xFFFF & 0000); //10진수 FFFF와 0의 비트 논리곱을 수행
}
}
10 & 7 = 2
123 & 456 = 72
0xFFFF & 0000 = 0
3. 비트 논리합 연산자 |
a. '10 | 7'
A | B | A | B |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
비트 논리합의 결과는 1111₂이고, 이는 10진수로 15
public class EX04_10 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.printf(" 10 | 7 = %d \n", 10 | 7); //10과 7의 비트 논리합을 수행
System.out.printf(" 123 | 456 = %d \n", 123 | 456); //123과 456의 비트 논리합을 수행
System.out.printf(" 0xFFFF | 0000 = %d \n", 0xFFFF | 0000); //16진수 FFFF와 0의 비트 논리합을 수행
}
}
10 | 7 = 15
123 | 456 = 507
0xFFFF | 0000 = 65535
4. 비트 배타적 논리합 연산자 ^
a. 두 값이 다르면 1, 같으면 0이 됨. 즉 1^1이나 0^0이면 결과가 거짓(0)이고, 1^0이나 0^1이면 결과가 참(1)
b. 10^7
A | B | A^B |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
비트 배타적 논리합 결과는 1101₂이고, 이는 10진수로 13
public class EX04_11 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.printf(" 10^7 = %d \n", 10^7); //10과 7의 비트 배타적 논리합을 수행
System.out.printf(" 123^456 = %d \n", 123^456); //123과 456의 비트 배타적 논리합을 수행
System.out.printf(" 0xFFFF^0000 = %d \n", 0xFFFF^0000); //16진수 FFFF와 0의 비트 배타적 논리합을 수행
}
10^7 = 13
123^456 = 435
0xFFFF^0000 = 65535
5. 비트 부정 연산자 ~
a. 각 비트를 반대로 만드는 연산자. 즉 0은 1로 바꾸고, 1은 0으로 바꿈. 이렇게 반전된 값을 1의 보수라 하며, 그 값에 1을 더한 값을 2의 보수라 함. 비트 부정 연산자는 해당 값의 음수(-)값을 찾고자 할 때 사용.
public class EX04_12 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a = 12345;
System.out.printf(" %d \n", ~a + 1); //a 값의 2의 보수를 구함. ~a+1->음수
}
}
-12345
6. 왼쪽 시프트 연산자 <<
a. 나열된 비트를 왼쪽으로 시프트(shift)
b. 26을 왼쪽으로 두 칸 시프트 연산
public class EX04_13 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a = 10;
System.out.printf("%d 를 왼쪽 1회 시프트하면 %d 이다. \n", a, a<<1); //a(시프트할값)<<1(횟수(칸수))
System.out.printf("%d 를 왼쪽 2회 시프트하면 %d 이다. \n", a, a<<2);
System.out.printf("%d 를 왼쪽 3회 시프트하면 %d 이다. \n", a, a<<3);
}
}
10 를 왼쪽 1회 시프트하면 20 이다.
10 를 왼쪽 2회 시프트하면 40 이다.
10 를 왼쪽 3회 시프트하면 80 이다.
10*2¹ / 10*2² / 10*2³
0011(₂)을 왼쪽으로 시프트 -> 10진수는?
-> 3*2¹=6
7. 오른쪽 시프트 연산자 >>
a. 나열된 비트를 오른쪽으로 시프트하는 연산자
b. 26을 오른쪽으로 두 칸 시프트 연산
public class EX04_14 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a = 10;
System.out.printf("%d 를 오른쪽 1회 시프트하면 %d 이다. \n", a, a>>1);
System.out.printf("%d 를 오른쪽 2회 시프트하면 %d 이다. \n", a, a>>2);
System.out.printf("%d 를 오른쪽 3회 시프트하면 %d 이다. \n", a, a>>3);
System.out.printf("%d 를 오른쪽 4회 시프트하면 %d 이다. \n", a, a>>4);
}
}
10 를 오른쪽 1회 시프트하면 5 이다.
10 를 오른쪽 2회 시프트하면 2 이다.
10 를 오른쪽 3회 시프트하면 1 이다.
10 를 오른쪽 4회 시프트하면 0 이다.
0011(₂) 오른쪽 1칸 시프트 -> 10진수는?
-> 3/2¹=1
public class EX04_15 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a = 100, result;
int i;
for (i = 1; i <=5; i++) { //왼쪽 시프트 연산을 다섯 번 반복해서 출력. 반복문(시작값;종료값;증감값)
result = a<<i; //1부터5까지가i에저장. for문을썼기때문에
System.out.printf("%d << %d = %d \n", a, i, result);
}
for (i=1; i<=5; i++) { //오른쪽 시프트 연산을 다섯 번 반복해서 출력. i<100이라고적으면실제로100번가능
result = a>>i;
System.out.printf("%d >> %d = %d \n", a, i, result);
}
}
100 << 1 = 200
100 << 2 = 400
100 << 3 = 800
100 << 4 = 1600
100 << 5 = 3200 _까지 *2의n제곱
100 >> 1 = 50
100 >> 2 = 25
100 >> 3 = 12
100 >> 4 = 6
100 >> 5 = 3 /2의n제곱
'개발 일기 > Java Programming' 카테고리의 다른 글
If 문 (0) | 2023.12.29 |
---|---|
연산자 우선순위 (0) | 2023.09.13 |
논리 연산자 (0) | 2023.09.11 |
관계 연산자 (0) | 2023.09.11 |
산술 연산자 | 우선순위 | 강제 형 변환 | 대입 연산자 | 증감 연산자 | 복합 연산자 (0) | 2023.09.11 |