1 논리 연산자(&&, ||, ^)
논리연산자는 여러 조건을 동시에 검사할 때 사용하는 연산자로, 두 항의 값이 boolean값일 경우 사용하는 연산자이다.
논리연산자에는 AND(&&)와 OR(||), NOT(!) XOR(^) 연산자가 있다. 각 논리연산자의 기능은 다음과 같다.
종류 | 연산자 | 사용 예 | 설명 |
AND | && | a && b | a와 b 둘다 참일 경우 참이다. |
OR | || | a || b | a또는 b 둘중 하나라도 참이면 참이다. |
NOT | ! | !a | a가 참이면 거짓이고 거짓이면 참이다. |
XOR | ^ | a ^ b | a 와 b 둘이 다르면 참 같으면 거짓이다. |
2 비트 연산자(&, |, ^ㅡ ~)
비트연산자는 개발자가 직접 비트를 조작할 수 있는 연산자이다. 연산하는 수를 이진법으로 표현했을 때 규칙에 따라 알맞은 결과를 반환한다.
비트 연산자에는 AND(&)와 OR(|), NOT(~) XOR(^) 연산자가 있다. 각 비트연산자의 기능은 다음과 같다.
종류 | 연산자 | 사용 예 | 설명 |
비트 AND | & | a && b | 둘 다 1 이어야만 1 |
비트 OR | | | a || b | 둘 중 하나라도 1이면 1 |
비트 NOT | ~ | ~a | (0과 1을) 뒤집어 |
비트 XOR | ^ | a ^ b | 둘이 다르면 1 |
3 시프트 연산자(<<, >>, >>>)
시프트 연산자는 주어진 방향대로 비트수만큼 이동하는 것이다.
<< | 왼쪽 시프트 연산자 | 왼쪽으로 주어진 비트 수만큼 이동 : 뒤 비어 있는 빈칸은 모두 0으로 채운다. |
>> | 오른쪽 시프트 연산자 | 오른쪽으로 주어진 비트 수만큼 이동 : 앞에 비어 있는 빈칸은 모두 부호 비트로 채운다. |
>>> | unsigned | 오른쪽으로 주어진 비트 수만큼 이동 : 앞에 비어 있는 빈칸은 모두 0으로 채운다. |
1 << 연산자
양수의 경우
int a = 16;
a = a << 2;
연산 전 a = 0000 0000 0000 0000 0000 0000 0001 0000 // 16
연산 후 a = 0000 0000 0000 0000 0000 0000 0100 0000 // 64
음수의 경우
a = -2147483648 // -2^31
a << 1;
연산 전 a = 1000 0000 0000 0000 0000 0000 0000 0000 // -2147483648 = -2^31
연산 후 a = 0000 0000 0000 0000 0000 0000 0000 0000 // 0
양수, 음수 둘다 왼쪽으로 주어진 비트 수(2)만큼 이동 후 비어있는 빈칸은 0으로 채워 준다.
2 >> 연산자
양수의 경우
int a = 2147483647; // 2^31-1
a >>= 1;
연산 전 a = 0111 1111 1111 1111 1111 1111 1111 1111 // 2147483647 = 2^31-1
연산 후 a = 0011 1111 1111 1111 1111 1111 1111 1111 // 1073741823 = 2^30-1
음수의 경우
int a = -2147483648; //-2^31
a >>= 1;
a >>= 30;
연산 전 a = 1000 0000 0000 0000 0000 0000 0000 0000 // -2147483648 = -2^31
연산 후 a = 1100 0000 0000 0000 0000 0000 0000 0000 // -1073741824 = -2^30
연산 후 a = 1111 1111 1111 1111 1111 1111 1111 1111 // -1 = -2^0
양수와 음수의 >> 연산 결과가 다르다.
※ >>연산자는 비트 값들을 오른쪽으로 이동 시킨 후 왼쪽의 빈 공간에는 양수는 0으로 음수는 1로 채운다는 것을 알 수 있다.
3 >>> 연산자
int a = -2147483648; //-2^31
a >>> 1;
a >>> 30;
연산 전 a = 1000 0000 0000 0000 0000 0000 0000 0000 // -2147483648 = -2^31
연산 후 a = 0100 0000 0000 0000 0000 0000 0000 0000 // 1073741824 = 2^30
연산 후 a = 0000 0000 0000 0000 0000 0000 0000 0001 // 1 = -2^0
※ >>>연산자는 부호를 신경쓰지 않는다. 따라서 비트 값들을 오른족으로 이동 시킨 후 왼쪽의 빈 공간은 모두 0으로 채운다.
Ex
예제
1 AND연산
&& : AND연산. "둘 다 true여야만 true."
(ex) sysout(true && true);
결과
true
(ex) int num = 10;
sysout(5<num && num<15);
결과
true
(ex) "num이 짝수이고 0보다 크면 true"
sysout( num%2==0 && num>0 );
결과
true
tip 짝수를 나타낼 때에는 a%2==0, 홀수를 나타낼 때에는 a%2==1
& : 비트 AND연산. "둘 다 1 이어야만 1"
0 & 0 : 0
0 & 1 : 0
1 & 1 : 1
(ex) sysout(0b0001 & 0b0011); // 이진수 0001 과 0011
결과
1
2 OR연산
|| : OR연산자. "둘 중 하나라도 true이면 true"
false || false : false
false || true : true
true || true : true
(ex) sysout(true || false); // true
sysout(false || false); // false
(ex) int num = 10;
sysout(num>10 || num%2==0); // true
// num이 홀수이거나 5이상이면 true
--> num%2==1 || num>=5
// num이 0보다 작거나 짝수이면 true
--> num<0 || num%2==0
| : 비트 OR연산자. "둘 중 하나라도 1이면 1"
0 | 0 = 0
0 | 1 = 1
1 | 1 = 1
(ex) sysout(0b0001 | 0b0011); // 0b0011
결과
3
3 NOT연산
! : NOT연산. (true와 false를) 뒤집어.
(ex) sysout( ! false ); // true
(ex) int num = 10;
sysout( ! (num==10) ); // false
sysout( ! (num%2==1) ); // true
~ : 비트 NOT연산. (0과 1을) 뒤집어.
(ex) byte b = (byte)0b11110111;
sysout( b ); // -9
sysout( ~b ); // 00001000 -> 8
tip b의 값이 -9인 이유 :
4 XOR연산
^ : XOR연산( 논리 연산자 : "둘이 다르면 true." )
true ^ true : false
true ^ false : true
(ex) num이 짝수, num이 7. 이 둘 중 하나만 만족하면 true
(1) int num = 4;
--> sysout((num%2==0) ^ (num==7)); // true
(2) int num = 7;
--> sysout((num%2==0) ^ (num==7)); // true
(3) int num = 3;
--> sysout((num%2==0) ^ (num==7)); // false
^ : 비트 XOR연산( 비트 연산자 : "둘이 다르면 1." )
sysout( 0b0001 ^ 0b0011 ); // 0 0 1 0 --> 2
'Java > Java 기초문법' 카테고리의 다른 글
[JAVA 기초] 제어문 - 조건문 (if, else if) (0) | 2021.03.02 |
---|---|
[JAVA 기초] 비교 연산자와 삼항 연산자 (0) | 2021.03.01 |
[JAVA 기초] 단항 연산자 (0) | 2021.02.27 |
[JAVA 기초] 산술 연산자와 대입 연산자 (0) | 2021.02.26 |
[JAVA 기초] 연산자의 종류와 우선순위 (0) | 2021.02.26 |
댓글