비트 연산자 (<< , >>)
1. 비트 연산자 (<<) LeftShift
#include <stdio.h>
int main(void)
{
int num = 15; // 00000000 00000000 00000000 00001111
int result1 = num << 1; //num의 비트 열을 왼쪽으로 1칸씩 이동
int result2 = num << 2; //num의 비트 열을 왼쪽으로 2칸씩 이동
int result3 = num << 3; //num의 비트 열을 왼쪽으로 3칸씩 이동
printf("1칸 이동 결과 : %d\n", result1); //result1 : 00000000 00000000 00000000 00011110 => 30
printf("2칸 이동 결과 : %d\n", result2); //result2 : 00000000 00000000 00000000 00111100 => 60
printf("3칸 이동 결과 : %d\n", result3); //result3 : 00000000 00000000 00000000 01111000 => 120
/*
* 비트 연산 결과
* 1. 비트의 열을 왼쪽으로 1칸씩 이동시킬 때마다 정수의 값은 두 배가 된다
* 2. 비트의 열을 오른쪽으로 1칸씩 이동시킬 때마다 정수의 값은 2로 나누어진다.
*/
return 0;
}
비트 연산자 (<<) LeftShift 사용 결과
1. 비트의 열을 왼쪽으로 1칸씩 이동시킬 때마다 정수의 값은 두 배가 된다.
2. 비트의 열을 오른쪽으로 1칸씩 이동시킬 때마다 정수의 값은 2로 나누어진다.
3. 비트의 이동으로 인해서 생기는 오른쪽 빈 칸은 0으로 채워지고, 밀려나는 왼쪽 비트들은 그냥 버려진다.
1. 비트 연산자 (>>) RightShift
num1 >> num2
num2의 크기만큼 num1의 비트 열이 오른쪽으로 이동한 결과가 반환된다.
num1이 양의 정수라면 (MSB가 0이라면) 밀려나는 오른쪽의 비트들은 소멸되고, 왼쪽의 빈 비트들은 0으로 채워진다.
num1이 음의 정수라면 (MSB가 1이라면) num1이 양의 정수일때와는 조금 다른 방식이 적용되어야 한다. 마찬가지로 왼쪽의 빈 비트들이 0으로 채워지면 num1이 더 이상 음의 정수가 아니게 되기 때문이다.
-16을 비트 연산자(>>2)를 통해서 2칸씩 오른쪽으로 이동시키면 어떤 결과가 만들어질까?
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 // -16(2진수)
이 결과는 CPU에 따라서 빈 왼쪽 비트에 0이 채워지기도 하고, 1이 채워지기도 하므로 달라진다.
0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 // 0이 채워진 경우
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 // 1이 채워진 경우 => 부호 비트를 유지하는 시스템
내 CPU 에서는 부호 비트를 유지하는 시스템으로 결과가 나왔다.
'c' 카테고리의 다른 글
[c언어/열혈 c프로그래밍] p.100 문제 04-4 비트 연산의 이해 (0) | 2023.08.05 |
---|---|
[c언어/열혈 c프로그래밍] 음의 정수 크기 확인하기 (0) | 2023.08.05 |
[c언어/열혈 c프로그래밍] p.89 문제 04-3 음의 정수 표현하기 (0) | 2023.08.05 |
[c언어/열혈 c프로그래밍] p.83 문제 04-2 <데이터 표현의 이해> (0) | 2023.08.03 |
[c언어/열혈 c프로그래밍] p.82 문제 04-1 <진법의 이해> (0) | 2023.08.03 |