CS

CHAE·2024년 9월 25일

CS

목록 보기
1/1

MSB, LSB

  • MSB (최상위 비트) : 여러 비트로 구성된 이진 데이터에서 가장 왼쪽에 있는 비트
  • LSB (최하위 비트) : 가장 오른쪽에 있는 비트

부호 비트

부호가 있는 데이터의 경우 MSB는 부호의 의미를 갖게 된다. MSB가 0이면 양수, 1이면 음수를 나타낸다.

예를 들어 이진수 0b10010000의 경우 부호가 있는 데이터라면, MSB가 1이기 때문에 10진수로 표현하면 음수인 -112가 된다.

0b10010000
부호비트: 1 (음수)
나머지 비트: 0010000
0010000 -> 1101111 + 1 = 1110000
1110000 -> 십진수 변환 = 0*2⁰ + 0*2¹ + 0*2² + 0*2³ + 1*2⁴ + 1*2⁵ + 1*2⁶
= 16+32+64 = 값 -112

만약 부호가 없는 데이터라면 MSB 1은 부호를 의미하지 않고, 값을 의미하므로 양수 144가 된다.

0b10010000
10010000 -> 십진수 변환 = 16 + 128 = 값 : 144

바이트 오더링 (Byte Ordering)

2바이트 이상의 데이터는 메모리에 연속적으로 저장된다. 이때 각 바이트가 메모리에 정렬되는 방식을 바이트 오더링이라고 한다. 바이트 오더링의 두 가지 방식으로 빅 엔디안(Big Endian)리틀 엔디안(Little Endian)이 있다.

  • 빅 엔디안 (Big Endian) : 가장 왼쪽에 있는 큰 바이트부터 메모리의 낮은 주소에 저장된다.
0x12345678 
  주소   데이터
-------|-----
0x1000 | 0x12  (가장 큰 바이트)
0x1001 | 0x34
0x1002 | 0x56
0x1003 | 0x78  (가장 작은 바이트)
  • 리틀 엔디안 (Little Endian) : 가장 오른쪽에 있는 작은 바이트부터 메모리의 낮은 주소에 저장된다.
0x12345678 
  주소   데이터
-------|-----
0x1000 | 0x78  (가장 작은 바이트)
0x1001 | 0x56
0x1002 | 0x34
0x1003 | 0x12  (가장 큰 바이트)

| 문자열을 메모리에 저장할 때는 바이트 오더링을 고려하지 않고 문자 순서 그대로 메모리에 저장된다.

비트 연산

비트 연산자설명
xㅣy두 비트 중 하나라도 1이면 결과는 1. (OR)
x & y두 비트 모두 1이면 결과는 1. (AND)
x ^ y두 비트가 같다면 결과는 0, 다르다면 1. (XOR)
~x비트가 0이라면 결과는 1, 1이라면 결과는 0 (NOT)
  • OR (|) 예시
    • 0b1101 | 0b1010 = 0b1111
1101
llll
1010
1111
  • AND(&) 예시
    • 0b1101 & 0b1010 = 0b1000
1101
&&&&
1010
1000
  • XOR(^) 예시
    • 0b1101 ^ 0b1010 = 0111
      서로 같다면 0, 다르다면 1
1101
^^^^
1010
0111
  • NOT(~) 예시
    • ~ 0b1010 = 0b0101
      0은 1이 되고, 1은 0이 된다
1010
~~~~
0101

시프트 연산자

시프트 연산은 비트를 좌측이나 우측으로 이동시키며, 연산 속도가 빠르고 효율적이기 때문에 특정 작업을 최적화하는데 많이 사용된다.

  • 아래 표는 2바이트의 크기를 가지는 데이터 104를 좌측으로 4비트 만큼 산술 시프트하는 모습을 보여준다. 10진수 104를 이진수로 변환하면 0000 0000 0110 1000이 되며, 이를 죄측으로 4비트만큼 이동시키면 0000 0110 1000 0000이 되고, 이를 다시 10진수로 변환하면 1664가 된다.
10진수 : 104
이진수로 변환 : 0000 0000 0110 1000
4비트만큼 좌측으로 시프트 : 0000 0110 1000 0000
시프트된 이진수를 다시 10진수로 변환 : 1664
0000000001101000=104
<< 40000011010000000=1664
  • 아래 표는 2바이트 크기를 가지는 데이터 20011을 우측으로 4비트만큼 산술 시프트하는 모습을 보여준다. 10진수 20011을 16비트 이진수로 변환하면 0100 1110 0011 0011이 되며, 이를 우측으로 4비트만큼 이동시키면 0000 0100 1110 0011이 되고, 이를 다시 10진수로 변환하면 1267이 된다.

    • 우측으로 4비트만큼 산술 시프트하면, 상위 비트(MSB)는 부호 비트를 유지하면서 하위비트(LSB)를 이동시키고, 이동된 자리에는 부호 비트로 채워진다.
10진수 : 20011
이진수로 변환 : 0100 1110 0011 0011
4비트만큼 우측으로 시프트 : 0000 0100 1110 0011
시프트된 이진수를 10진수로 변환 : 1267
0100111000110011=20011
>> 40000010011100011=1267
  • 아래 표는 1111 1111 0001 0001에 4비트만큼 우측으로 논리 시프트를 하는 모습이다. MSB에 상관없이 0으로 채우기 때문에 이진수 0000 1111 1111 0001이 된다.
1111111100010001-239
>>> 40000111111110001=4081

0개의 댓글