[비트 논리 연산자]
and & 두 비트가 모두 1일때 결과 1
or | 두 비트중 하나라도 1이 있으면 결과 1
xor ^ 두 비트가 서로 다를 때만 결과 1
not ~ 비트가 1이면 0이고, 0이면 1
<and>
11 = 1011(2)
5 = 0101(2) &
-----------------
0001(2) = 1
<or>
11 = 1011(2)
5 = 0101(2) |
-----------------
1111(2) = 15
<xor>
11 = 1011(2)
5 = 0101(2) ^
-----------------
1110(2) = 14
<not>
~11 = 0100(2) = 4
~5 = 1010(2) = 10
*not 연산 시 예상한 결과가 나오지 않는 이유
우리가 사용한 bit의 갯수: 4개
컴퓨터가 사용하는 bit의 갯수: 64개
*not 연산을 했을 때 결과값은 어떻게 계산해야 할까?
<not 연산 계산 공식>
~a = -a-1
왜 ~양수 = 음수, ~음수 = 양수
컴퓨터는 음수를 저장할 수 없기 때문에 음수를 표현하는 약속이 있다.
-비트를 사용하여 부호를 표현하는 방법
최상위 비트 = 부호비트 라고 한다.
부호비트가 0이면 양수
부호비트가 1이면 음수로 표현한다.
~11 = -12
~-12 = 11
1) -12의 4bit 표현방법 구하기
2) -12의 4bit not 연산시 11이 나오는것 확인
12 1100
+(-12)0100
----------
0 0000
-12: 0100(2)
~-12: 1011(2) = 11
#include <stdio.h>
int main() {
int x = 11;
int y = 5;
int z = -3;
printf("x&y:%d\n",x&y);
printf("x|y:%d\n", x | y);
printf("x^y:%d\n", x ^ y);
printf("~x:%d\n", ~x);
printf("~y:%d\n", ~y);
printf("~z:%d\n", ~z);
printf("y<<1:%d\n", y << 1);
printf("y>>1:%d\n", y >> 1);
return 0;
}
실행결과
[비트 쉬프트 연산자]
shift: 이동
왼쪽 쉬프트: <<
오른쪽 쉬프트: >>
5<<1 : 1010(2) = 10
이동하다가 더이상 올 bit가 없을 경우, 0으로 채워짐
*왼쪽 쉬프트 연산은 1칸당 x2의 연산과 동일
5>>1 : 0010(2) = 2
오른쪽 쉬프트 연산은 1칸당 /2의 연산과 동일
우리가 비트연산을 알아야 하는 이유?
비트연산 = 컴퓨터가 하는 연산
컴퓨터의 연산으로 명령을 내려준다면, 대용량의 데이터 연산을 할 땐 성능의 차이가 있기 때문이다.
[관계 연산자], 비교연산자
연산의 결과가 참, 혹은 거짓으로 나온다
A = 2
B = 3
A<B A가 B보다 작은가
A>B A가 B보다 큰가
A<=B A가 B보다 작은거나 같은가
A>=B A가 B보다 크거나 같은가
A==B A와 B가 같은가
A!=B A와 B가 같지않은가
<실습>관계연산자.c
*문자열은 ==를 사용해서 같은지 비교할 수 없다.
<string.h> : 문자열과 관련된 기능 포함
*문자열이 같은지 비교하는 기능
strcmp(문자열1, 문자열2);
문자열1과 문자열2가 같으면 0
다르면 -1 또는 1이 나옴
[논리연산자]
논리값으로 연산을 하는 연산자
논리연산자
and 두 값이 모두 참일 때 결과 참
or 두 값중 하나라도 참이면 결과 참
not 참 -> 거짓, 거짓 -> 참(부정)
and &&
or ||
not !
<실습>논리연산자.c
식+식
논리값:0,1
논리값 연산자 논리값
관계식 연산자 관계식
우선순위:논리연산자 < 관계연산자
[대입연산자]
변수 = 값;
값을 왼쪽의 변수에 저장을 한다
변수 = 식;
int x = 2+3;
int y = 3;
y = y+10;
오른쪽 y에 3을 넣고 10을 더한 후 왼쪽의 y에 저장을 한다.
int y = 3;
y = y+10;
[복합대입연산자]
산술연산자,대입연산자를 복합적으로 사용
y+=10; //y = y+10;
연산 순서대로 연산자 적기
y+=10; : y에 10을 누적시킨다.
[증감연산자]
기존 변수의 값에 1을 증가시키거나, 1을 감소시키는 연산자
++
--
후위형: y++; //y+=1;
전위형: ++y; //y+=1;
후위형: 값의 증가가 마지막에 연산
전위형: 값의 증가가 먼저 연산