기본 콘텐츠로 건너뛰기

C++ - 부호비트와 시프트 연산

2. 부호비트와 시프트 연산
    수치 데이터를 저장하는 데이터 타입에는 부호가 있는 데이터와 부호가 없는 데이터가 있습니다. 
    부호가 없는 데이터 값을 시프트 연산하는 것과 달리 부호가 있는 데이터 값을 시프트 연산할 때에는
    부호비트에 따라 연산 과정이 조금 달라집니다.
    2.1 부호비트와 왼쪽 시프트 연산(Left - Shift)
        왼쪽으로 시프트 연산을 수행하는 경우 값은 2배씩 증가하게 됩니다. 이때 아래의 그림과 같이
        최상위 비트와 그 다음 비트가 서로 다른 값인 경우 오버플로우(Overflow)가 발생합니다.
        
        위의 그림이 왼쪽 시프트 연산을 하기 전 값은 79 이지만 "79 << 1" 을 연산한 결과는 "10011110" 이
        되며 10진수로 변환한 결과 값은 -98이 됩니다. 최상위 비트가 부호비트가 아니라면 연산 결과는
        79 의 2 배인 158 이지만 최상위비트가  변경되어 오버플로우가 발생하였기 때문에 부호가 바뀌고
        결과 값이 원하는 값과 다르게 나온 것입니다.
        오버플로우는 부호비트가 1 에서 0 으로 변경된 경우에도 발생하며 이 때에는 음수가 양수로 바뀌게
        됩니다. 그러므로 부호가 있는 데이터의 왼쪽 시프트 연산 시에는 오버플로우가 발생할 수 있는
        것을 고려해주어야 합니다.
    2.2 부호비트와 오른쪽 시프트 연산(Right - Shift) 
        오른쪽으로 시프트 연산을 하는 경우는 2의 제곱으로 나누기 연산을 하는 것입니다. 이때 비트들이
        오른쪽으로 이동하면서 생긴 공간은 부호비트의 값으로 채워집니다. 아래의 그림에서는 부호비트가
        1이기 때문에 1로채워지지만 만약 부호비트값이 0이라면 0으로 채워지게 됩니다.
        
        예를 들어 위의 그림과 같이 "1011 1111" 값을 오른쪽으로 한번 이동하면 왼쪽에 생긴 빈 공간은
        최상위 비트인 1 값으로 채워지는 것입니다. 만약 "-160 >> 4" 를 연산하면 -160 의 이진수 값인
        "1010 0000" 가 오른쪽으로 4비트만큼 이동하고, 왼쪽에 생긴 네개의 빈 공간은 최상위 비트인
        1 로 채워지므로 연산 결과는 "1111 1010" 가 됩니다.

댓글

이 블로그의 인기 게시물

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 ...