- 순서
- 시프트 연산자란?
- 산술 시프트란?
- 논리 시프트란?
- 산술 시프트와 논리 시프트 차이
- 보수법
- 시프트 연산자란?
- 시프트라는 말 그대로 이동을 시키는 것을 의미한다. 산술 시프트(<<, >>) 또는 논리 시프트 >>>를 이용함
- 시프트 연산자는 10진수를 2진수로 표현한 값을 이동시킨다. 즉, 비트를 이동시키는 연산자
- 시프트 연산자는 피연산자가 2개인 2항 연산자이다.
- 시프트 연산자는 2진수로 표현된 비트를 해당하는 방향으로 이동시키는 연산자이다.
- 산술 시프트란?
- 숫자의 부호 비트는 유지하면서 나머지 비트를 왼쪽 또는 오른쪽으로 이동하는 연산자.
- 산술 시프트에 대한 예시
- 1byte 즉 8bit를 기준으로 비트로 표현한다면 10진수 정수 10을 2진수로 변환하면 [0 0 0 0 1 0 1 0]임. => 시프트 '<<'는 왼쪽으로 이동시키라는 뜻이며 이동하여 빈 칸은 0이 들어와서 채운다.10 << 2이라고 한다면 10진수의 정수 10을 2진수로 변환한 비트값을 왼쪽으로 2칸 이동하라는 뜻 => [0 0 0 0 1 0 1 0]은 [0 0 1 0 1 0 0 0 ]이 된다. 이동시킨 2진수를 10진수로 변환하면 정수 40이 된다. 이동하기 전 10 에서 40으로 값이 변화 40은 10 * 4이다 4는 2에 제곱이다 그러면 10 << 2는 10 * 2^2가 된다. x << n 은 x * n^2라는 공식이다.
- 반대로 '>>'는 오른쪽으로 이동시키라는 뜻. 10 >> 2 즉 [0 0 0 0 1 0 1 0]을 2만큼 이동시키면 [0 0 0 0 0 0 1 0]이 된다. 기존에 있던 1과 0이 사라지게 되었는데 비트 범위 밖으로 넘어가면 사라지게 됨. 또한 ^n이 였던 '<<'과 다르게 'x >> n'는 x /(2^n)의 값을 가진다.
- 단 '<<'를 통해 오른쪽으로 이동시킬 때는 빈 자리가 0으로 채워지지만 '>>'을 통해 오른쪽으로 밀게되면 제일 앞 부호비트는 유지하고 왼쪽에 생기는 빈칸은 부호비트 값으로 채워진다.
- 논리 시프트란?
- 부호 비트를 포함해 전체 비트를 이동시키는 연산자.
- 논리 시프트는 산술 시프트와 다르게 오른쪽 방향으로만 미는 '>>>' 연산자만 존재함.
- 전체 비트를 오른쪽으로 이동 시키며 빈칸은 모두 0으로 채움. 부호 비트까지 이동시키기 때문에 부호 1비트가 1인 음수일 때는 논리 시프트 이후에 값이 양수로 변함.
- 산술 시프트와 논리 시프트 차이
- 산술 연산자는 '<<'와 '>>'를 통해 좌, 우로 이동시키지만 논리 연산자는 '>>>'만을 통해 오른쪽으로만 이동시킴
- 산술 연산자는 부호비트는 변하지 않은 상태로 이동시키지만, 논리 연산자는 부호비트를 포함하여 이동시킴
- 산술 연산자는 '>>'를 통해 오른쪽으로 밀때 부호비트를 고정시키고 빈 칸을 부호비트 값(0 또는 1)으로 채우지만 논리 연산자는 부호비트를 포함하여 이동하면서 빈 칸은 0으로 채운다
- 보수법
- 보수란 각 자리 숫자의 합이 어느 일정한 수가 되게 하는 수이다. 보통 현재의 숫자에서 자릿수를 한단계 올리기 위한 수를 말함.
- 보수의 종류
- 1의 보수
- 각 비트를 반전시킴(0 => 1, 1 => 0)
- 2의 보수
- 1의 보수 +1
- 양수/음수의 구분이 쉬움(MSB:이진수에서 가장 왼쪽의 비트를 의미, 부호 비트)
- 덧셈으로 뺄셈이 가능
- 예를 들어 10 - 5 를 10 + (-5) = 10 + (2의 보수 [1 1 1 1 1 0 1 1])로 계산함
- 1의 보수
- 보수 구하는 법
- r진법을 2진수로 변환 후 비트연산을 해야함
- r진법의 보수에서 n에 대한 r-1의 보수는 그 자릿수에서 가질 수 있는 최댓값-n
- r의 보수는 r-1의 보수에 +1을 해준 값
- 보수법을 사용하는 이유: 컴퓨터가 음수를 표현하고 마이너스 연산을 플러스 연산으로 하기 위함
'C++' 카테고리의 다른 글
| [C++]Rvalue/Lvalue (0) | 2025.07.22 |
|---|---|
| [C++] 연산자 오버로딩 (0) | 2025.07.17 |
| [C++] is-a/has-a 관계 (0) | 2025.07.14 |
| [C++] Iterator 반복자 (0) | 2025.07.10 |
| [C++]Alogorithm헤더파일 (1) | 2025.07.08 |