코딩이란 무엇일까

[Java/자바]논리연산자, 비트연산자 (2) 본문

Java

[Java/자바]논리연산자, 비트연산자 (2)

둥구는 지굴다 2022. 9. 19. 14:42

안녕하세요 저번에 단항 연산자와 산술 연산자를 알아보았는데요.

이번 포스팅에는 논리 연산자와 비트 연산자에 대해 알아보겠습니다.

 논리연산자

논리 연산자란 여러 가지 조건을 동시에 검사할 때 사용하는 연산자입니다.

두 항의 값이 boolean 값일 때 연산 가능합니다.

 

종류 연산자 사용예  설명
AND && a&&b a와 b 둘다 참이면 결과가 참
OR !! a||b a와 둘중 하나만 참에 해당하면 결과가 참
NOT ! !a a가 참이면 거짓, 거짓이면 참, 반대로

이렇게 표로만 보니까 이해하기 힘드시죠? 예시 코드를 작성해서 보여드릴게요!

public class Logic_operator {

	public static void main(String[] args) {
		boolean a=true;
		boolean b=false;
		boolean c=true;
		
		System.out.println(a&&b); // a값과 b값이 모두 참일 때만 결과가 참 : AND
		//즉, a는 참이지만 b는 false이기 때문에 결과 값은 =>false가 나온다
		System.out.println(a&&c);//a와 c모두 true이기 때문에 => true
		System.out.println((2<4)&&(4<5));//둘다 true이기 때문에 => true
		
		System.out.println(a||b);//a와 b둘중 하나가 true라면 결과값은 true 
        						//따라서 b는 false이지만 a가 true이기때문에 
                                //결과 값=> true 
		System.out.println(a||c);//a와 c둘다 ture이기때문에 결과 값 =>true
		System.out.println(b||b);//b는 false이기 때문에 둘다 값이 false이기 때문에 
        								//결과 값 => flase
		
		System.out.println(!a);//a가 true가 아닌 값 즉, false냐고 물어보는 것 이기 때문에 
        						//a는 true이기 때문에 결과 값=> false

	}

}

&&연산자는 간단합니다. 비교하는 두 값이 둘 다 참이어야 지 값이 참입니다. 따라서 a와 b를 비교하면 a는 true이지만 b는 false이기 때문에 false라는 값이 나옵니다. 반대로 a와 c는 둘 다 true라는 값을 저장해 두었기 때문에 a&&c는 true라는 값을 출력할 수 있는 것이지요.

||연산자는 엔터키 위에 있는 원화 표시를 shift를 누른 채로 눌러주시면 됩니다.

||연산자는 비교하는 값이 둘 중 하나만 참 이어도 true라는 값이 나옵니다.

! 연산자는 부정을 합니다.

a가 true이면 반대로 false냐?라고 물어보는 것입니다. 

따라서 a는 true이기 때문에 false라는 값이 나옵니다.

비트 연산자

비트 연산자는 비트 단위로 연산을 하는 연산자를 말합니다.

비트 연산자의 종류

  • 비트 논리 연산자
  • 비트 쉬프트 연산자

비트란?(bit)

비트는 데이터의 최소 단위를 비트라고 합니다.

컴퓨터는 0과 1 즉, 2진수로 데이터를 표현합니다.

따라서 0과 1 이 최소 단위를 1bit라고 합니다.

1bit가 8 개모이면 1byte가 됩니다.

8bit = 1byte

 

비트 논리 연산자란?

비트 논리 연산자란 비트 단위로 논리 연산을 하는 연산자를 말합니다.

 

비트 논리 연산자의 종류

 

종류 연산자 사용 예 설명
비트AND & a&b a와b모두 1이라면 1
비트OR | a|b a와 둘중 하나라도 1이면 결과 1
비트XOR ^ a^b a와b가 서로 다르면1 같다면0
비트NOT ~ ~a a가 1이면0, 0이면1

자 이제 저희는 위에 배웠던 논리 연산자와 헷갈리면 안 됩니다.

비트 연산자는 우리가 눈에 보이는 데이터 값을 생각하면 안 됩니다.

컴퓨터가 받아들이는 2진수인 0과 1로만 데이터로 봐야 합니다.

우선 컴퓨터의 마음을 이해하기 위해서 10진수를 2진수로 계산하는 방법을 알아봅시다.

 

1) 10진수의 2진수 변환

사용자가 바꾸고자 하는 값 즉, 10진수를 2로 나누어 몫이 1이 될 때까지 나눈 후 거꾸로 올려주시면 됩니다.

자 위에를 보시면 15를 2로 계속 나누어 몫이 1까지 나올 때까지 나누어 주셨다면 이제 1 부분부터

나머지를 올려줍니다. 따라서 1111 즉, 15를 2진수로 변환하면 1111이라는 값이 나옵니다.

15 외에도 10은 뭐 1010 , 24는 11000과 같이 꼭 4자리 숫자가 아닙니다.

이점 유의해주시기 바랍니다.

2) 2진수의 10진수 변환

자 이제 10진수를 2진수로 변환하는 방법을 알아보았으니 2진수를 다시 10진수로 변환하는 방법도 알아봐야겠죠?

우선 방법만 간단하게 말씀드리면 각 자리의 값이 1인 수를 2의 승으로 계산한 뒤 그 값을 합해 줍니다.

자 위에 나와있는 1111이라는 2진수 값을 다시 10진수로 올려 보죠

위의 자료처럼 맨 뒤부터 0승으로 시작해서 점점 증가해 2의 승으로 계산한 뒤

다 더해주면 10진수를 구할 수 있습니다.

 

3) 2진수의 덧셈

위의 그림만 보면 이게 뭔 그림인가 싶죠? ㅜㅜ 제가 그림을 잘 못 그려서

우선 간단하게 말씀드리면 1+1=0이 됩니다. 1+0=1이 됩니다. 

여기서 중요한 점은 1+1을 하면 앞자리에 1이 추가됩니다. 

따라서 1+1=0을 계산하고 1이 그 앞자리 수로 추가되고 이런 식의 반복입니다.

따라서 1111(2) +0101(2) =10100(2)

15+5=20이라는 값이 나오게 되는 것이지요

비트 논리 연산자 예시

public class Xor_pratice {

	public static void main(String[] args) {
		int a=15; //2진수로 바꾸면 1111(2)
		int b=5; //0101(2)
		//비트 논리연산자
		System.out.println(a&b);//0101(2) =5
		System.out.println(a|b);//1111(2) =15
		System.out.println(a^b);//1010(2)=10
		System.out.println(~b); //1010(2) =10x ->-6
		
	}

}

예시 출력 결과

& (AND) 비트 논리 연산자 설명

| (OR) 비트 논리 연산자 설명

^ (XOR) 비트 논리연산자 설명

자 이제 &와 | ,^연산자를 설명해 드렸는데 아직 설명 안 해드린 연산자가 하나 남았습니다. 바로 ~ (not) 연산자인데 

우선 출력 결과를 보시면 -6이 나옵니다.

 

하.. 여기서 정말 머리가 아프죠? 간단하게 짚고 넘어가 봅시다!

우선 부호가 바뀌는 이유를 알아봅시다.

저희는 지금 편의상 5라는 10진수를 0101이란 4bit로 표현하지만

우리의 컴퓨터는 32bit 혹은 64bit 운영체제를 사용합니다.

따라서 사실 4bit 앞에는 60개의 0들이 있고 맨 뒤에 4bit로 0101로만 5를 표현한 것입니다.

자 이쯤 되면 부호가 바뀌는 이유를 대충 짐작은 할 수 있겠죠?

1) 부호가 바뀌는 이유

 

컴퓨터는 음수를 표현할 수 없습니다 애당초 0과 1만 있는데 음수를 표현하기에는 불가능하겠죠?

따라서 음수를 표현할 수 있는 약속 같은 것을 했습니다.

부호를 표현하는 비트는 부호 비트라고 합니다.

부호 비트는 최상위 비트입니다. 즉, 비트의 맨 앞을 뜻하는 것이죠.

따라서 맨 앞의 비트가 0이라면 => 양수

1이라면 => 음수

라는 약속을 하게 된 것입니다.

따라서 ~연산자는 반대로 생각하기 때문에

0을 1로 출력을 하게 되어 - 라는 값이 나오게 된 것입니다.

2)~5가 -6으로 나오는 이유

5를 4bit로 표현으로 계산했듯이

-6의 4bit로 구해봅시다.

하.. 근데 지금 10진수를 2진수로 바꾸는 것도 어려운데 음수로 된 10진수를 어떻게 바꿀까..라고 생각하시는 분들이 많을 겁니다.

따라서 저희는 약간의 편법을 사용해 볼까 합니다.

우선 6을 2진수로 변환하면 ==>0110이 나옵니다. 다라서 

6에 -6을 하면 0이라는 값이 나오기 때문에

6을 0으로 만드는 4bit를 구하면 -6을 구할 수 있겠죠?

따라서 0110이 0000이라는 값이 되려면

1010이라는 값이 들어가면 0000이 됩니다.

여기서 주의해주셔야 할 점은 1010을 양수로 생각하면 10이라는 10진수가 나오지만 음수로 계산을 할 시에는 -6이라는 숫자가 나온다는 것입니다.

 

결과적으로 ~(-6)을 출력해보면 반대로 5라는 숫자가 나옵니다.

위의 계산법이 너무 이해 안 가신다 싶으면

~a= -a-1이라는 공식?으로 외워두면 좋습니다.

비트 쉬프트 연산자

비트 쉬프트 연산자는 비트의 이동을 연산합니다.

비트 쉬프트 연산자의 종류

종류 연산자 사용 예  설명
왼쪽 쉬프트 << a<<n a의 비트를 왼쪽으로n만큼 이동해라
오른쪽 쉬프트 >> a>>n a의 비트를 오른쪽으로 b만큼 이동해라

오른쪽 쉬프트 연산자 예시

ex) 15>>2

 

오른쪽 쉬프트 연산자는 쉽게 생각해서 오른쪽으로 1칸씩 이동할 때마다 10진수의 값 나누기 2라는 값을 해주시면 편합니다. 물론 나머지는 생략하고 몫만 구해줍니다. 15/2 => 7 // 7 /2=>3이라는 숫자가 최종적으로 나오게 됩니다.

왼쪽 쉬프트 연산자 예시

5<<4

=>0101을 4번 왼쪽으로 이동해라

왼쪽 쉬프트 연산자도 공식이 있는데 이동하고자 하는 값이 왼쪽으로 이동할 때마다 곱하기 2라는 값을 해주시면 됩니다.

5*2=10

10*2=20

20*2=40

40*2=80

이라는 값을 최종적으로 볼 수 있는 것이지요.

자 오늘은 논리 연산자와 비트 연산자에 대해 알아보았습니다.

논리 연산자는 그렇다 쳐도 비트 연산자는 저도 처음에는 너무 어렵고 어디에 쓰이는지도 잘 몰라서 그냥 간단하게 넘어갔는데 하다 보니 재미도 있고 쓰임새도 있더라고요 그래서 초반에는 그냥 간단하게 보고 넘어가 주셔도 되는 내용인 것 같아요 ㅎㅎ 이상 포스팅 마치겠습니다.

Comments