기본 콘텐츠로 건너뛰기

C++ - 시프트 연산자

데이터 << 이동할 비트 수  (왼쪽으로 이동)    ==>  데이터 * (2 ^ 이동할 비트 수)
데이터 >> 이동할 비트 수  (오른쪽으로 이동)  ==>  데이터 / (2 ^ 이동할 비트 수)


1. 시프트 연산자란?
    시프트 연산자는 데이터를 비트 단위로 이동시켜 값을 증감시키는 연산자입니다. 비트는 2진수의
    형태를 가지고 있기때문에 비트를 이동시키는 방향에 따라서 값이 2배씩 증가 혹은 감소하게됩니다.
    그래서 2의 제곱으로 값을 변경시키는 경우에 유용하게 사용할 수 있습니다.
    프로그램에서 시프트 연산자는 "<<" 혹은 ">>" 키워드를 사용하여 아래와 같은 형식으로 표현합니다.
    데이터 << 이동할 비트 수
    데이터 >> 이동할 비트 수
    "<<" 키워드는 데이터를 왼쪽으로 비트 수만큼 이동시키기 때문에 2의 "이동할 비트수" 를 제곱한 값과
    데이터가 곱해진 값이 결과 값으로 도출됩니다. 아래의 코드는 값을 왼쪽으로 시프트 시키는 예입니다.
    // int 형 변수에 5를 저장
    int number = 5;
    // 5를 왼쪽으로 3비트 이동하는 시프트 연산을 한다. 연산결과는 40 이다.
    // 5 * (2^3) = 5 * 8 = 40
    int result = number << 3;
    위의 코드는 5가 저장된 number 변수를 왼쪽으로 3비트 이동시키는 것입니다. 비트의 각 자리수는
    왼쪽으로 갈수록 2배씩 가중치가 증가하기때문에 number 값을 3비트 이동시키면 2의 3제곱 값을
    곱한만큼 값이 증가하게 됩니다. 즉, "5 << 3" 은 5에 2의 3제곱인 8을 곱하는 것과 같습니다.
    
    위의 그림은 5에 3만큼 왼쪽으로 시프트하는 과정을 나타낸 것입니다. 5의 2진수인 "101" 가  왼쪽으로
    3만큼 이동한 후 생긴 빈 공간에는 0이 채워져서 "101000" 이 되는 것을 볼 수 있습니다. 그래서 결과 
    값은 5에 8(2의 3제곱)을 곱한 40이 됩니다.
    이번에는 아래의 코드와 같은 오른쪽으로 1만큼 시프트하는 연산에 대해 알아보겠습니다.
    // int 형 변수에 40 을 저장
    int number = 40;
    // 40 을 오른쪽으로 1비트 이동하는 시프트 연산을 한다. 연산결과는 20 이다.
    // 40 / (2^1) = 40 * 2 = 20
    int result = number >> 1;
    위의 코드는 40이 저장된 number 를 오른쪽으로 1비트 이동시키는 것입니다. 비트의 각 자리수는
    오른쪽으로 이동할수록 2의 제곱으로 가중치가 감소하기 때문에 number 값을 오른쪽으로 1비트
    이동시키면 2배만큼 감소하게 됩니다. 즉, "40 >> 1" 은 40에서 2를 나눈 것과 같습니다.
    
    위의 그림은 40에서 오른쪽으로 1번 시프트하는 과정을 나타낸 것입니다. 40의 2진수인 "101000" 을
    오른쪽으로 1만큼 이동한 후 생긴 빈 공간에는 0이 채워지고 결과 값은 "10100" 이 되는 것을 볼 수
    있습니다. 그래서 결과 값은 40에 2를 나눈 20이 됩니다. 

댓글

이 블로그의 인기 게시물

C# - Serial Port ASCII/HEX Format

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO.Ports; namespace SerialTest1 {     public partial class Form1 : Form     {         delegate void MyDelegate();      //델리게이트 선언(크로스 쓰레드 해결하기 위한 용도)         bool SendForamt = true;          // true : ASCII   false : HEX         bool ReceiveFormat = true;       // true : ASCII   false : HEX         public Form1()         {             InitializeComponent();          ...

C# - Windows Form 에 있는 control 찾기

// 아래 코드는 form 의 최상위 control만 찾을 수 있음. // panle, groubbox ... 내부에 있는 control은 찾지 못함. Control GetControlByName(string Name) {     foreach (Control c in this.Controls)         if (c.Name == Name)             return c;     return null; } // form 의 모든 control을 찾을 수 있음. string name = "btnBit" + (i + 1).ToString("D2"); var tmpBtn = this.Controls.Find(name, true).FirstOrDefault(); if (tmpBtn != null) {     if (value == 1) tmpBtn.BackColor = Color.Lime;     else tmpBtn.BackColor = Color.Gray; }

C# - ARGB 색상

속성 A 이  Color  구조체의 알파 구성 요소 값을 가져옵니다. Alice Blue ARGB 값이  #FFF0F8FF 인 시스템 정의 색을 가져옵니다. Antique White ARGB 값이  #FFFAEBD7 인 시스템 정의 색을 가져옵니다. Aqua ARGB 값이  #FF00FFFF 인 시스템 정의 색을 가져옵니다. Aquamarine ARGB 값이  #FF7FFFD4 인 시스템 정의 색을 가져옵니다. Azure ARGB 값이  #FFF0FFFF 인 시스템 정의 색을 가져옵니다. B 이  Color  구조체의 파랑 구성 요소 값을 가져옵니다. Beige ARGB 값이  #FFF5F5DC 인 시스템 정의 색을 가져옵니다. Bisque ARGB 값이  #FFFFE4C4 인 시스템 정의 색을 가져옵니다. Black ARGB 값이  #FF000000 인 시스템 정의 색을 가져옵니다. Blanched Almond ARGB 값이  #FFFFEBCD 인 시스템 정의 색을 가져옵니다. Blue ARGB 값이  #FF0000FF 인 시스템 정의 색을 가져옵니다. Blue Violet ARGB 값이  #FF8A2BE2 인 시스템 정의 색을 가져옵니다. Brown ARGB 값이  #FFA52A2A 인 시스템 정의 색을 가져옵니다. Burly Wood ARGB 값이  #FFDEB887 인 시스템 정의 색을 가져옵니다. Cadet Blue ARGB 값이  #FF5F9EA0 인 시스템 정의 색을 가져옵니다. Chartreuse ARGB 값이  #FF7FFF00 인 시스템 정의 색을 가져옵니다. Chocolate ARGB 값이  #FFD2691E 인 시스템 정의 색을 가져옵니다. Coral ARGB ...