나의 IT일지
연산자(비트, 삼항, 기타 등등) 본문
- 연산자란 CPU에서 변수나 상수를 연산을 하기 위한 명령어
- 산술 연산자: 수학에서 사용하는 사칙연산으로 값을 연산하는 명령어
- 대입연산자: 오른쪽 데이터를 왼쪽 변수에 저장하는 연산자
- 증감연산자: 변수의 값을 1 증가하거나 감소할 때 사용하는 연산자,
- 비교 연산자: 두 값의 관계가 참(1)인지 거짓(0)인지 판별하는 연산자
- 논리 연산자: 연산식or 조건식 조합의 참과 거짓을 판단하는데 사용되는 연산자
그럼 이번에는 비트 연산자, 삼항 연산자, 콤마 연산자, 형변환 연산자, 크기 연산자에 대해서 알아보자.
비트 연산자
비트 연산자는 데이터를 비트단위로 연산하는 연산자로, 비트를 가지고 논리적으로 연산하는 비트 논리 연산자와 비트를 좌우로 움직이게 하는 비트 쉬프트 연산자로 나뉜다.
이때 비트란 무엇이냐? 데이터의 최소단위로, 데이터의 이진수 0,1이 들어가는 공간이라고 생각하면 좋다. 그렇다면 비트 연산자를 사용하기 위해서는 10진수(현재 사용하는 숫자)와 2진수를 자유롭게 변환할 줄 알아야 한다.
- 10진수를 2진수로 변환하는 방법은 다음과 같다. (예시:10을 2진수로 변환)
- 10진수를 2로 계속 나눈다. (10/2 = 5···0, 5/2 = 2···1, 2/2=1···0)
- 몫이 0이 나오면, 몫을 기준으로 역순에 적으면 된다. (10 = 1010(2))
나눌 값 | 나누는 값 | 몫 | 나머지 | 10진수 : 10 2진수 : 1010(2) |
10(시작값) | 2 | 5 | 0 | |
5 | 2 | 2 | 1 | |
2 | 2 | 1 | 0 | |
1 | 2 | 0 | 1 |
- 2진수를 10진수로 변환하는 방법을 한번 보자 (예시:10의 2진수를 10진수로 변환)
- 2^0부터 시작으로 각 비트의 자릿수에 2의 지수를 적고 비트의 값과 곱한다. (1*2^3, 0*2^2, 1*2^1, 0*2^0)
- 2의 지수를 계산 후, 나온 숫자를 더한다. (2^3+2^1=10)
2진수 자리 | 2^3의 자리 | 2^2의 자리 | 2^1의 자리 | 2^0의 자리 | 2진수 : 1010(2) 10진수 : 10 |
시작값 : 1010(2) | 1 | 0 | 1 | 0 | |
곱할 값 | 2^3 | 2^2 | 2 | 1 | |
곱한값 | 8 | 0 | 2 | 0 |
아래의 표는 비트 논리 연산자의 종류이며, 그것을 이용한 소스코드와 실행결과를 같이 보자.
연산자 | 이름 | 예시 | 의미 |
& | 비트AND | a&b | 두 비트가 모두 1일때만 결과가 1 |
| | 비트OR | a|b | 두 비트중 하나라도 1이라면 결과가 1 |
^ | 비트XOR | a^b | 두 비트가 서로 다르면 1 같으면 0 |
~ | 비트NOT | ~a | 비트가 1이면 0으로 0이면 1로 전환(부호변환) |
#include<stdio.h>
void main() {
int a = 1, b = 2; //(a=0001(2),b=0010(2))
//AND연산과정
printf("a&b =%d\n", a&b);
//OR연산과정
printf("a|b=%d\n", a|b);
//XOR연산과정
printf("a^b=%d\n", a^b);
//NOT연산과정
printf("~a=%d\n", ~a);
}
위의 소스코드의 연산과정을 한번 확인해 보자.
연산자 | 변수 a의 2진수 | 변수 b의 2진수 | 연산결과 | 연산결과의 10진수 |
a&b (AND) | 0001 | 0011 | 0001 | 1 |
a|b (OR) | 0001 | 0011 | 0011 | 3 |
a^b (XOR) | 0001 | 0011 | 0010 | 2 |
~a(NOT) | 0001 | - | 1110 | -2 |
- AND의 경우, '0과 0은 0', '0과 1은 0', '1과 1은 1'로 출력이 되기에 0001
- OR의 경우, '0과 0은 0', '0과 1은 1', '1과 1은 1'로 출력이 되기에 0011
- XOR의 경우, '0과 0은 0', '0과 1은 1', '1과 1은 0'으로 출력되기에 0010
- NOT의 경우, '0은 1', '1은 0'으로 변환이 되기에 1110
근데, NOT연산자를 사용하면 "1110"인 2진수가 이기에, "14"로 출력이 되어야 하는데, "-2"로 출력 되는것을 확인할 수 있다. 이는 컴퓨터의 운영체제가 64bit를 지원하기에, 나타나는 현상인데, 사실 "1"을 2진수로 변환하면, "0 000 000 000.... 001(2)"이며, NOT연산자를 사용하면 "1 111 1111 1111....1110(2)"가 된다.
그렇다면 "1 111 1111 1111....1110(2)"가 왜 "-2" 일까? 해당 2진수와 AND연산을 해서 결과 값이 0이 되는 값을 확인해 보자.
AND연산 할 2진수 | 0의 2진수 | AND연산해서 0이 되는 값 | 이 되는 값의 10진법 |
1 111 1111 1111....1110(2) | 0 000 0000 0000 .... 0000(2) | 0 000 0000 0000 .... 0010(2) | 2 |
다음은 비트 쉬프트 연산자의 종류이며, 그것을 이용한 소스코드와 실행결과를 같이 보자.
연산자 | 이름 | 예시 | 내용 |
<< | 왼쪽 쉬프트 | a<<4 | a의 내용을 왼쪽으로 4bit이동 |
>> | 오른쪽 쉬프트 | a>>4 | a의 내용을 오른쪽으로 4bit이동 |
#include<stdio.h>
void main() {
int a = 10 ;
printf("a<<1:%d\n", a << 1);
printf("a>>1:%d\n", a >> 1);
printf("a<<2:%d\n", a << 2);
printf("a>>2:%d\n", a >> 2);
}
위 소스코드의 연산과정을 한번 확인해 보자.
연산자 | 변수a의 2진수 | 연산결과 | 연산결과의 10진수 |
a<<1 | 01010 | 10100 | 20 |
a>>1 | 01010 | 00101 | 5 |
a<<2 | 001010 | 101000 | 40 |
a>>2 | 001010 | 000010 | 2 |
- a<<1의 경우, 2진수 값을 왼쪽으로 1칸씩 옮겨지고, 빈자리는 0으로 채움
- a>>1의 경우, 2진수 값을 오른쪽으로 1칸씩 옮겨지고, 빈자리는 0으로 채움
- a<<2의 경우, 2진수 값을 왼쪽으로 2칸씩 옮겨지고, 빈자리는 0으로 채움
- a>>2의 경우, 2진수 값을 오른쪽으로 2칸씩 옮겨지고, 빈자리는 0으로 채움
정리하자면, 왼쪽 쉬프트는 비트값이 왼쪽으로 옮겨지며, 빈자리는 0으로 채워지고, 밀려난 값은 삭제가 되며, 오른쪽 쉬프트는 비트값이 오른쪽으로 옮겨지며, 빈자리는 0으로 채워지고, 밀려난 값은 삭제가 된다.
삼항 연산자
삼항 연산자란 항이 3개인 연산자로, 조건에 따라 항목1이나 항목2를 수행하는 연산자이다.
조건 ? 항목 1: 항목2
삼항 연산자는 조건이 참일경우, 항목1을 실행하며, 거짓일 경우, 항목2를 실행이 된다. 예를 들면 "a >= 100 ? printf("100이상인 자연수") : printf("100 미만인 자연수")"라는 코드가 있다고 하자. 만약 a에 200을 저장했을 경우, 100이상인 자연수를 출력하며, a에 20을 저장했을 경우, 100미만인 자연수를 출력한다.
#include<stdio.h>
void main() {
int a ;
//삼항연산자
//조건? 참일때 값:거짓일때 값
printf("값:");
scanf("%d", &a);
a >= 100 ? printf("100이상인 자연수") : printf("100 미만인 자연수");
}
기타 연산자들
- 콤마 연산자 : 여러 항목을 나열할 때 사용하는 연산자로, 왼쪽부터 오른쪽으로 차례로 연산이 진행된다.
- 형변환 연산자 : 이미 정해져 있는 자료형을 다른 자료형으로 변환하는 연산자로, "(변환하고 싶은 자료형) 변수형;"으로 구성되어 있으며, 실수에서 정수로 바꿀 때, 소수점 자리는 버려지고, 정수로 출력된다.
- 크기 연산자 : 자료형이나 데이터의 크기를 바이트 단위로 반환하는 연산자로, "sizeof(자료형or변수명)"으로 구성되어 있으며, "scanf_s"에서 입력되는 데이터의 크기에 사용되기도 한다
연산자 우선 순위
하나의 수식에서 2개 이상의 연산자가 있을 경우, 컴퓨터는 연산자의 우선 순위에 따라 정보를 처리한다.
- 최우선연산자
- 단항연산자(증감연산자, 논리 부정 연산자, 부호 연산자)
- 산술연산자
- 쉬프트연산자
- 관계연산자
- 논리 연산자
- 삼항연산자
- 대입연산자
이때 우선순위가 동일한 연산자가 사용될 경우, 왼쪽부터 차례대로 연산이 된다. 하지만 대입 연산자나 단항연산자가 같은 수식에 2개 이상 사용될 경우에는 오른쪽 부터 차례대로 연산이 된다.
'프로그래밍 언어 > C언어' 카테고리의 다른 글
조건문(switch문) (0) | 2023.02.09 |
---|---|
조건문(if문) (0) | 2023.02.08 |
연산자(산술, 대입, 증감, 비교, 논리) (0) | 2023.02.06 |
기타 입출력함수 (0) | 2023.02.05 |
입력함수 scanf (0) | 2023.02.04 |