[CS] Shift operator / 시프트 연산

Onam Kwon·2022년 11월 27일
0

CS

목록 보기
15/22
post-custom-banner

Shift operator

  • 정수 또는 열거형 표현식의 비트를 오른쪽이나 왼쪽으로 시프팅 하는 연산자.
    • left shift: <<
    • right shift: >>
  • 변수 a를 왼쪽으로 2칸 시프팅 하는것을 기호로 a << 2 로 표현함.
  • 변수 a를 오른쪽으로 1칸 시프팅 하는것을 기호로 a >> 1 로 표현함.
  • 비트 이동시 이진법의 자릿수를 넘어가는 숫자들은 폐기 처리되며, 반대편에서 빈칸을 채우는 숫자는 0으로 채운다.
    • 예를들어 0010 을 왼쪽으로 2번 시프팅 즉, << 2를 한다면
      • 1000이 되며, 이를 왼쪽으로 1번 더 시프팅 즉, <<1를 추가로 한다면 0000이 된다.

GitHub source code

Left shift <<

3 = 0011
3 << 1 = 0110 = 6
3 << 2 = 1100 = 12
3 << 3 = 1000 = 8
  • 왼쪽 연산자는 각 비트를 왼쪽으로 시프팅한다.
  • 시프팅시, 만일 앞에 시프트된 숫자가 갈 자리가 없다면, 그 부분은 버려진다. 또한 뒤에서 새로 채워지는 부분은 앞에서 버려진 숫자가 가는 것이 아니라 무조건 0 으로 채워진다.
#include <iostream>

using namespace std;

int main() {

    // Decimal number 3 is 0011 in binary.
    int a = 3;
    cout<<"a is: "<<a<<endl;

    // a is left shifted by 1 so it is 0110 in binary.
    int temp = a << 1;
    cout<<"a << 1 is: "<<temp<<endl;

    return 0;
}
~/De/D/C/P/Algorithms/A/ShiftOperator main ?1 ❯ g++ main.cpp -o main.out
~/De/D/C/P/Algorithms/A/ShiftOperator main ?1 ❯ ./main.out             22:50:59
a is: 3
a << 1 is: 6
  • 정수형 변수 a에 3의 값을 초기화해 준 후, 왼쪽으로 한칸 시프팅한 결과를 출력했다.
  • 참고로 이진법을 사용하기 때문에 시프팅되는 값이 폐기되지 않는다는 전제하에 한칸 시프팅 될 때 마다 값은 2배가 된다(왼쪽으로 이동하기 때문).
    • 따라서 3을 왼쪽으로 한칸 시프팅했을 경우 위처럼 2배인 6이 출력됨.

Right shift >>

12 = 1100
12 >> 1 = 0110 = 6
12 >> 2 = 0011 = 3
12 >> 3 = 0001 = 1
  • 오른쪽 연산자는 각 비트를 오른쪽으로 시프팅한다.
  • 2진법을 사용하기 때문에 마찬가지로 시프팅되는 값이 폐기되지 않는다는 전제하에 한칸 시프팅 될 때 마다 값은 2분의 1이된다(오른쪽으로 이동하기 때문).
  • 시프팅시, 만일 앞에 시프트된 숫자가 갈 자리가 없다면, 그 부분은 버려진다. 또한 뒤에서 새로 채워지는 부분은 앞에서 버려진 숫자가 가는 것이 아니라 무조건 0 으로 채워진다.

References

profile
권오남 / Onam Kwon
post-custom-banner

0개의 댓글