본문 바로가기
Java/Java 기초문법

[JAVA 기초] 논리 연산자와 비트연산자

by dev수니 2021. 2. 27.
반응형

1 논리 연산자(&&, ||, ^)

논리연산자는 여러 조건을 동시에 검사할 때 사용하는 연산자로, 두 항의 값이 boolean값일 경우 사용하는 연산자이다.

논리연산자에는 AND(&&)와 OR(||), NOT(!) XOR(^) 연산자가 있다. 각 논리연산자의 기능은 다음과 같다.

종류연산자사용 예설명
AND&&a && ba와 b 둘다 참일 경우 참이다.
OR||a || ba또는 b 둘중 하나라도 참이면 참이다.
NOT!!aa가 참이면 거짓이고 거짓이면 참이다.
XOR^a ^ ba 와 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

 

반응형

댓글