포스트

비트 연산, 시프트 연산

비트 연산, 시프트 연산

💫 공통


정수형 데이터의 연산만 가능 (실수형 데이터 X)

  • And, Or, Not, Exclusive-Or/XOR
  • Bit Operator, Bit Operation & | ~ ^
  • Bit Vector, 길이 w의 0/1로 구성된 데이터
  • 비트 벡터를 이용한 집합의 표현과 운영 (비트 연산)

  • Bit 인자(피연산자)들을 Bit Vector로써 비트 단위 연산 Bit Wise Operate
  • 마스크 연산
    • 일종의 비트 패턴으로, 원하는 비트를 추출
    • 워드 중 일부 선택된 비트 집합
  • 비트 연산자 vs 논리 연산자
    • || OR, && AND, ! NOT
    • 0 = false, !0 = true
    • 항상 0이나 1 산출
    • Early termination
      • Short-Circuit Evaluation
        • p && *p, avoids null pointer access
      • 반면 비트 연산자는 모두 연산

2.1.9 C의 비트이동 연산

  • 좌측 이동 x « k
    • 왼쪽 초과 비트들은 버림
    • 우측 0로 채움
  • 우측 이동 x » k
    • 오른쪽 초과 비트들은 버림
    • 논리 쉬프트, 왼쪽 0로 채움
    • 산술 쉬프트, 오른쪽 최상위 비트 복제
      • 2의 보수 정수 표현에 유용

💫 비트 연산


🫧 &

AND, 비트 AND 연산자
양쪽 피연산자의 각 비트를 비교하여 양쪽 모두 1이면 1, 아니라면 0으로 설정.

1
2
3
4
5
6
int x = 3;
//      3, ...0011
int y = 5;
//      5, ...0101
int z = x & y;
//      1, ...0001

🫧 ^

  • XOR, 포괄적 비트 XOR 연산자, (eXclusive OR)
  • 양쪽 피연산자의 각 비트를 비교하여 서로 다르면 1, 아니라면 0으로 설정.
1
2
3
4
5
6
int x = 3;
//      3, ...0011
int y = 5;
//      5, ...0101
int z = x ^ y;
//      6, ...0110

🫧 |

  • OR, 배타적 비트 OR 연산자
  • 양쪽 피연산자의 각 비트를 비교하여 한 쪽이라도 1이면 1, 아니라면 0으로 설정.
  • Shift + 역슬래시 (Enter 위에 있는 키, ₩) 로 입력할 수 있음.
1
2
3
4
5
6
int x = 3;
//      3, ...0011
int y = 5;
//      5, ...0101
int z = x | y;
//      7, ...0111

🫧 ~

  • NOT, 비트 보수(또는 비트 NOT) 연산자
  • 피연산자의 비트 보수를 만듦 (0에서 1, 1에서 0으로 수를 뒤집음)
  • 여담으로, ~ 는 단항 산술 연산자로 분류됨. (MSDC 기준)
1
2
3
4
int x = 15;
//      15, ...0000'0000'0000'1111
int y = ~x;
//     -16, ...1111'1111'1111'0000

💫 비트 시프트 연산자


  • 주의 할 점
    • 비트 시프트 연산자로 수행된 변환은 오버플로, 언더플로 조건을 지원하지 않음.
      • 때문에 연산 결과가 첫 번째 피연산자 형식으로 표현할 수 없는 경우,
      • 오류가 발생하지 않으며, 정보가 손실될 수 있음.

🫧 «

  • 첫 번째 피연산자를 두 번째 피연산자 만큼 왼쪽으로 이동.
  • 계산에 오버플로가 없는 경우, 첫 번째 피연산자에 2두 번째 피연산자 를 곱한 값과 같음.
  • 시프트 이후 비워진 비트는 0 으로 설정됨.
1
2
3
4
5
int x = 15;
//      15,  ...0000'0000'0000'1111
int y = x << 4;
//      240, ...0000'0000'1111'0000
//      240 = 15 * 2^4

🫧 »

  • 첫 번째 피연산자를 두 번째 피연산자 만큼 오른쪽으로 이동.
  • 첫 번째 피연산자가 부호가 없거나, 음수가 아닌 경우, 2두 번째 피연산자 로 나눈 값과 같음.
  • 시프트 이후 비워진 비트는 첫 번째 피연산자의 형식에 따라 채워짐.
    • 부호 없는 unsigned 형식이면, 0으로 채워짐 (최상위 비트 설정 해제)
    • 부호 있는 형식이라면 부호 비트가 복사되여 채워짐. 양수 0, 음수 1 (최상위 비트 설정된 채 유지)
1
2
3
4
5
int x = 240;
//      240, ...0000'0000'1111'0000
int y = x >> 4;
//      15,  ...0000'0000'0000'1111
//      15 = 240 / 2^4
  • 음수 값을 오른쪽으로 이동하면 원래 값의 반을 정수로 내림한 값이 생성됨.
    • -253 (11111111 00000011) 을 오른쪽으로 1비트 이동하면,
    • -127 (11111111 10000001) 이 생성됨.
    • 253 (00000000 11111101) 을 오른쪽으로 1비트 이동하면,
    • 126 (00000000 01111110) 이 생성됨.

💫 할당 연산자


  • 다른 연산자들과 마찬가지로 할당 연산자를 통해 값 변형과 할당을 동시에 할 수 있음.
    • &=
    • ^=
    • |=
    • ~ 는 단항 산술 연산자라 할당 연산자가 존재하지 않음.
    • <<=
    • >>=

💫 참고


비트 마스크

& = ?

웹에서 계산기 만들기

1
2
3
(value >> 16) & byte.MaxValue
(value >> 8) & byte.MaxValue
(value >> 0) & byte.MaxValue
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.