본문 바로가기

코드업(CodeUp)/기초 100제

[코드업/자바] 기초 100제 - 비트단위로 NOT 하여 출력하기

1059 : [기초-비트단위논리연산] 비트단위로 NOT 하여 출력하기

입력 된 정수를 비트단위로 참/거짓을 바꾼 후 정수로 출력해보자.
비트단위(bitwise)연산자 ~ 를 붙이면 된다.(~ : tilde, 틸드라고 읽는다.)


** 비트단위(bitwise) 연산자는,
~(bitwise not), &(bitwise and), |(bitwise or), ^(bitwise xor),
<<(bitwise left shift), >>(bitwise right shift)
가 있다.

예를 들어 1이 입력되었을 때 저장되는 1을 32비트 2진수로 표현하면
        00000000 00000000 00000000 00000001 이고,
~1은 11111111 11111111 11111111 11111110 가 되는데 이는 -2를 의미한다.


예시
int a=1;
printf("%d", ~a); //-2가 출력된다.

참고
컴퓨터에 저장되는 모든 데이터들은 2진수 형태로 바뀌어 저장된다.
0과 1로만 구성되는 비트단위들로 변환되어 저장되는데,
양의 정수는 2진수 형태로 바뀌어 저장되고,
음의 정수는 "2의 보수 표현"방법으로 저장된다.

예를 들어 int형(4바이트(byte), 32비트)으로 선언된 변수에 양의 정수 5를 저장하면
5의 2진수 형태인 101이 32비트로 만들어져
00000000 00000000 00000000 00000101
로 저장된다.(공백은 보기 편하도록 임의로 분리)

int 형의 정수 0은
00000000 00000000 00000000 00000000

그리고 -1은 0에서 1을 더 빼고 32비트만 표시하는 형태로
11111111 11111111 11111111 11111111 로 저장된다.

-2는 -1에서 1을 더 빼면 된다.
11111111 11111111 11111111 11111110 로 저장된다.

그래서 int 형으로 선언된 변수에는 최소 -2147483648 을 의미하는
10000000 00000000 00000000 00000000 부터

최대 +2147483647 을 의미하는
01111111 11111111 11111111 11111111 로 저장될 수 있는 것이다.

그렇다면 -2147483648
10000000 00000000 00000000 00000000 에서 1을 더 뺀다면?

01111111 11111111 11111111 11111111 이 된다.
즉 -2147483649 가 아닌 +2147483647 이 되는 것이다.

이러한 것을 오버플로우(overflow, 넘침)라고 한다.

이러한 내용을 간단히 표시하면, 정수 n이라고 할 때,

~n = -n - 1
-n = ~n + 1 과 같은 관계로 표현된다.

이 관계를 그림으로 그려보면 마치 원형으로 수들이
상대적으로 배치된 것과 같다.

 

입력

정수 1개가 입력된다.
-2147483648 ~ +2147483647

출력

비트 단위로 1 -> 0, 0 -> 1로 바꾼 후 그 값을 10진수로 출력한다.


입력 예시

2

출력 예시

-3


여기서 먼저 알고 가야할 것은 컴퓨터에 자료가 저장될 때 2진수 형태(0과 1로 표현된 형태)로 저장된다.

자료형마다 저장할 수 있는 자료 크기가 정해져있는데

우리가 제일 많이 쓰는 int형은 4byte를 저장할 수 있고 1byte가 8bit 이므로

int형은 32bit를 저장할 수 있다.

그래서 결론적으로 int형은 32비트 2진수 형태로 숫자를 저장할 수 있다.

그래서 00000000 00000000 00000000 00000000( = 0)부터

01111111 11111111 11111111 11111111( = 2^32 - 1 = 2147483647)까지

저장할 수 있다.(보기 편하게 공백을 집어넣었을 뿐 표현하고는 상관없다.)

 

그리고 '~'은 not이라는 뜻으로 어떤 조건 앞에 '~'을 붙이면 반대로 표현된다.

비트단위연산자 '~'은 32비트 2진수로 표현이 되었을때 각 자리가 반대로 변하면된다. 1은 0으로 0은 1로

int형 10진수 0은 32비트 2진수로 00000000 00000000 00000000 00000000으로 표현할 수 있고

-1은 0에서 1을 뺀 것으로 표현한다면 11111111 11111111 11111111 11111111로 표현할 수 있다.

 

이 때 ~0은 비트단위로 반전이 된다면 11111111 11111111 11111111 11111111로 표현할 수 있어서

~0 = 1 이라고 할 수 있다.

 

이러한 내용을 간단히 표시하면, 정수 n이라고 할 때,

~n = -n - 1
-n = ~n + 1 과 같은 관계로 표현된다.

 

그래서 비트단위연산자 중 '~'(NOT)을 사용하여 표현하는 프로그램을 작성하면

 

package excercise;
import java.util.*;

public class codeup {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int num = sc.nextInt();
		
		System.out.println(~num);
	}
}

 

이렇게 작성할 수 있다.

 

728x90
반응형