본문 바로가기
CodeUp 기초 100제/C

CodeUp[코드업] C언어 1053 ~ 1062 : [기초 - 논리 연산] ~ [기초 - 비트단위 논리 연산]

by En_Geon 2019. 12. 9.

1053 : [기초 - 논리 연산] 참 거짓 바꾸기

문제 설명 : https://codeup.kr/problem.php?id=1053

 

참(True, 1) 또는 거짓(False, 0)이 입력되었을 때, 반대로 출력하는 문제다.

 

  • 논리 연산자를 배운다.
  • 논리 연산자 중 부정(NOT) 연산자를 배운다.
  • C언어에서 비교 연산이 수행될 때 0은 거짓(False)이다.
  • 비교 연산이 수행될 때 참(True)은 0이 아닌 모든 수다.

논리 연산자 부정(NOT)을 의미하는 연산자는 '!'다.

 

논리 연산자는 참 / 거짓으로 결론 내릴 수 있는 두 대상을 피연산자로 사용한다.

논리 연산자에는 '||' (논리합, OR), '&&' (논리곱, AND), '!' (부정, NOT)이 있다.

 

'!' (부정, NOT) 연산은 저장된 값이 0이면 이를 뒤집어 참으로 만들고, 0이 아닌 수(음수 포함)라면 본래 참이지만 뒤집어 거짓으로 만든다.

 

C언어에서 '!' (부정, NOT)은 논리합이나 논리곱 연산자와 달리 논리 부정은 단항 연산자다. 따라서 우선순위도 높다.

논리 부정 연산자는 자주 사용하지 않는다.

생각을 두 번 해야 의미가 이해되는 논리식은 복잡하게 느껴질 수 있고 나아가 오류로 이어질 수도 있다. 

 

더보기

 

#include     <stdio.h>

int main()
{
    int x;
    scanf("%d", &x);
    printf("%d", !x);
    return 0;
}

 

1054 : [기초 - 논리 연산] 둘 다 참일 경우만 참 출력하기

문제 설명 : https://codeup.kr/problem.php?id=1054

 

참(True, 1) 또는 거짓(False, 0)이 입력되었을 때, 모두 참일 경우에만 참을 출력하는 문제다.

 

  • 논리 연산자를 배운다
  • 논리 연산자 중 논리곱(AND)을 배운다.
  • 비교 연산이 수행될 때 0은 거짓(False)다.
  • 비교 연산이 수행될 때 참(True)은 0이 아닌 모든 수다.

논리 연산자 논리곱(AND)을 의미하는 연산자는 '&&'다.

'&&' (논리곱, AND)는 피연산자 양쪽 모두 True이어야 True를 결과로 얻는다.

 

논리 연산자 '&&' (논리곱, AND)의 연산 결과

x y x  &&  y
True True True
True False False
False True False
False False False

x가 False면, x && y는 항상 False다.

 

'&&' (논리곱, AND) 연산은 어느 한쪽만 0(False, 거짓)이어도 전체 연산 결과가 0(False, 거짓)이므로 좌측 피연산자가 거짓이면, 우측 피연산자의 값은 평가하지 않고 넘어간다. 

 

이렇게 생략하고 넘어가는 현상을 쇼트서킷이라 한다.

쇼트서킷은 하지 않아도 될 연산을 생략해 논리 연산식의 효율을 높인다.

쇼트서킷의 특징을 배우기 위해선 '||' (논리합, OR) 연산자도 알아야 한다.

'||' (논리합, OR) 연산자는 다음 문제에서 자세하게 배운다.

 

쇼트서킷의 특징

  1. 논리 연산식은 무조건 왼쪽에서 오른쪽으로 수행한다.
  2. OR 논리식은 조건에 만족하면 이후 연산을 생략한다.
  3. AND 논리식은 조건에 만족하지 않으면 이후 연산은 생략한다.
  4. 혼합 논리식에서 AND는 한 덩어리로 묶고 OR의 연속으로 살핀다.

쇼트서킷의 특징에 대한 부연설명

더보기

1. 기본적으로 논리 연산식은 왼쪽에서 오른쪽 방향으로 연산을 수행한다. 논리 합과 곱이 함께 있는 혼합식에서도 무조건 왼쪽부터 연산한다.

 

2. OR 논리식은 왼쪽부터 단 하나의 조건이라도 만족한다면 나머지 연산들을 수행하지 않고 최종 결과는 참이 된다. 만일 OR 논리식의 최종 결과가 거짓이려면 모든 조건에 만족하지 않아야 한다.

 

3. 반대로 AND 논리식은 왼쪽부터 단 하나의 조건에 만족하지 않아도 나머지 연산들을 수행하지 않고 최종 결과는 거짓이 된다. 만일 AND 논리식의 최종 결과가 참이려면 모든 조건에 만족해야 한다.

 

4. 혼합 논리식은 OR을 중심으로 보면 쉽다. AND를 한 덩어리로 묶으면 다음과 같은 논리식은 크게 두 가지 식에 대한 논리합 연산이라 할 수 있다.

( x >= 20 && x <= 30 || y = 150)

만일 x가 10이면 첫 번째 관계 연산 결과가 거짓이므로 두 번째 식의 결과와 상관없이 세 번째 관계 연산을 수행한다.

 

위에서 배운 내용들을 활용하면 문제는 쉽게 맞힐 수 있다.

 

더보기

 

#include      <stdio.h>

int main()
{
    int x, y;
    scanf("%d %d", &x, &y);
    printf("%d", x&&y);
    return 0;
}

 

1055 : [기초 - 논리 연산] 하나라도 참이면 참 출력하기

문제 설명 : https://codeup.kr/problem.php?id=1055

 

참(True, 1) 또는 거짓(False, 0)이 입력되었을 때, 하나라도 참이면 참을 출력하는 문제다.

 

  • 논리 연산자를 배운다.
  • 논리 연산자 중 논리합(OR) 연산자를 배운다.
  • 비교 연산이 수행될 때 0은 거짓(False)다.
  • 비교 연산이 수행될 때 참(True)은 0이 아닌 모든 수다.

논리 연산자 논리합(OR)을 의미하는 연산자는 '||'다.

'||' 논리합(OR)은 피연산자 중 어느 한쪽만 True면 True를 결과로 얻는다.

 

논리 연산자 '||' (논리합, OR)의 연산 결과

x y x  ||  y
True True True
True False True
False True True
False False False

x가 False면, x && y는 항상 False다.

 

'||' (논리합, OR) 연산은 두 피연산자 중 어느 한쪽만 '참'이어도 전체 연산 결과가 '참'이므로 좌측 피연산자가 'True(참)'이면 우측 피연산자의 값은 평가하지 않고 생략한다.

'||' (논리합, OR) 연산도 마찬가지로 쇼트서킷이 나타난다.

 

더보기

 

#include      <stdio.h>

 

int main()

{

     int x, y;

     scanf("%d %d", &x, &y);

     printf("%d", x||y);

     return 0;

}

 

1056 : [기초 - 논리 연산] 참/거짓이 서로 다를 때에만 참 출력하기

문제 설명 : https://codeup.kr/problem.php?id=1056

 

참(True, 1) 또는 거짓(False, 0)이 입력되었을 때, 참, 거짓이 서로 다를 때에만 출력하는 문제다.

 

  • 비트 연산자를 배운다.
  • 비트 연산자 중 배타적 논리합 (XOR)을 배운다.

비트 연산자 배타적 논리합(XOR)을 의미하는 연산자는 '^'다.

1047에서 언급했던 비트 연산자 '^' 배타적 논리합(XOR)을 자세히 배운다.

 

비트 연산자 '^' (배타적 논리합, XOR)의 연산 결과

x y x  ^  y
1 1 0
1 0 1
0 1 1
0 0 0

'^' (배타적 논리합, XOR)은 피연산자의 값이 서로 다를 때만 1을 결과로 얻는다. 같을 때는 0을 얻는다.

 

더보기

 

#include    <stdio.h>

 

int main()

{

     int x, y;

     scanf("%d %d", &x, &y);

     printf("%d", x^y);

     return0;

}

 

1057 : [기초 - 논리 연산] 참/거짓이 서로 같을 때에만 참 출력하기

문제 설명 : https://codeup.kr/problem.php?id=1057

 

참(True, 1) 또는 거짓(False, 0)이 입력되었을 때, 참, 거짓이 서로 같을 때에만 출력하는 문제다.

 

  • 비트 연산자를 배운다
  • 배타적 논리합(XOR)의 응용이다.

앞 문제에서 배운 '^' (배타적 논리합, XOR)만을 사용해서는 풀리지 않는다.

비트 연산자 '^' (배타적 논리합, XOR)의 연산 결과표를 보고 어떤 경우에 서로 같은지를 확인하고 어떤 연산자를 써야 서로 같은 값이 나올지 생각한다.

 

더보기

 

#include     <stdio.h>

int main()
{
    int x, y;
    scanf("%d %d", &x, &y);
    printf("%d", !(x^y));
    return 0;
}

 

1058 : [기초 - 논리 연산] 둘 다 거짓일 경우만 참 출력하기

문제 설명 : https://codeup.kr/problem.php?id=1058

 

참(True, 1) 또는 거짓(False, 0)이 입력되었을 때, 모두 거짓일 때에만 출력하는 문제다.

 

  • 비트 연산자를 배운다.
  • 비트 연산자 중 논리합(OR) 연산자를 배운다.
  • 비트 연산자 논리합(OR) 연산자의 응용이다.

비트 연산자 논리합(OR)을 의미하는 연산자는 '|'다.

1047에서 언급했던 비트 연산자 '|' 논리합(OR)을 자세히 배운다.

논리 연산자 '||' (논리합, OR) 연산자와 비트 연산자 '|' (논리합, OR)은 같은 기능이지만 비트 단위로 움직인다는 것에서 다르다.

 

비트 연산자 '|' (논리합, OR)의 연산 결과

x y x  |  y
1 1 1
1 0 1
0 1 1
0 0 0

'|' (논리합, OR)은 피연산자 중 한쪽의 값이 1이면, 1을 결과로 얻는다. 그 외에는 0을 얻는다.

 

 '|' (논리합, OR)만을 사용해서는 풀리지 않는다.

비트 연산자 '|' (논리합, OR)의 연산 결과표를 보고 어떤 경우에 1(참)인지를 확인하고 어떤 연산자를 써야 서로 둘 다 거짓이 나올지 생각한다.

 

더보기

 

#include      <stdio.h>

int main()
{
    int x, y;
    scanf("%d %d", &x, &y);
    printf("%d", !(x|y));
    return 0;
}

 

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

문제 설명 : https://codeup.kr/problem.php?id=1059

 

입력된 정수를 비트단위로 참, 거짓을 바꾼 후 정수로 출력하는 문제다.

 

  • 비트 연산자를 배운다.
  • 비트 연산자 중 비트 전환 연산자(NOT)를 배운다.

비트 연산자 비트 전환 연산자(NOT)를 의미하는 연산자는 '~'(Tilde, 틸드)다.

1047에서 언급했던 비트 연산자 '~' 비트 전환 연산자(NOT)를 자세히 배운다.

 

이 연산자는 피연산자를 2진수로 표현했을 때, 0은 1로, 1은 0으로 바꾼다. 논리 부정 연산자 '!'와 유사하다.

 

'~' (비트 전환 연산자)의 2진 연산 결과

x ~x
1 0
0 1

비트 전환 연산자 '~'에 의해 '비트 전환'되고 나면, 부호 있는 타입의 피연산자는 부호가 반대로 변경된다. 즉, 피연산자의 '1의 보수'를 얻을 수 있는 것이다. 그래서 비트 전환 연산자를 '1의 보수'연산자라고도 한다.

 

더보기

 

#include     <stdio.h>

int main()
{
    int x;
    scanf("%d", &x);
    printf("%d", ~x);
    return 0;
}

 

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

문제 설명 : https://codeup.kr/problem.php?id=1060

 

입력된 정수 두 개를 비트단위로 AND 연산 후 정수로 출력하는 문제다.

 

  • 비트 연산자를 배운다.
  • 비트 연산자 중 논리곱(AND)을 배운다.

비트 연산자 논리곱(AND)을 의미하는 연산자는 '&'다.

1047에서 언급했던 비트 연산자 '&' 논리곱(AND)을 자세히 배운다.

논리 연산자 '&&' (논리곱, AND) 연산자와 비트 연산자 '&' (논리곱, AND)은 같은 기능이지만 비트 단위로 움직인다는 것에서 다르다.

 

비트 연산자 '&' (논리곱, AND)의 연산 결과

x y x  &  y
1 1 1
1 0 0
0 1 0
0 0 0

'&' (논리곱, AND)는 피연산자 양 쪽이 모두 1이어야만 1을 결과로 얻는다. 그 외에는 0을 얻는다.

 

더보기

 

#include     <stdio.h>

int main()
{
    int x, y;
    scanf("%d %d", &x, &y);
    printf("%d", x&y);
    return 0;
}

 

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

문제 설명 : https://codeup.kr/problem.php?id=1061

 

입력된 정수 두 개를 비트단위로 OR 연산 후 정수로 출력하는 문제다.

 

  • 비트 연사자를 배운다.
  • 비트 연산자 중 논리합(OR)을 배운다.

1058에서 배운 비트 연산자 중 논리합(OR)의 기본 문제다.

1058에 비트 연산자 논리합(OR)에 대한 자세한 설명이 있다.

 

더보기

 

#include     <stdio.h>

int main()
{
    int x, y;
    scanf("%d %d", &x, &y);
    printf("%d", x|y);  
    return 0;
}

 

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

문제 설명 : https://codeup.kr/problem.php?id=1062

 

입력된 정수 두 개를 비트단위 XOR 연산 후 그 결과를 정수로 출력하는 문제다.

 

  • 비트 연산자를 배운다.
  • 비트 연산자 중 배타적 논리합(XOR)을 배운다.

1056에서 배운 비트 연산자 중 배타적 논리합(XOR)과 같은 문제다.

1056에 비트 연산자 배타적 논리합(XOR)에 대한 자세한 설명이 있다.

 

더보기

 

#include     <stdio.h>

int main()
{
    int x, y;
    scanf("%d %d", &x, &y);
    printf("%d", x^y);
  
    return 0;
}

댓글