비트 연산자는 C 언어에 데이터 및 하드웨어의 저수준 작업을 용이하게 하기 위해 포함되었으며, 레지스터 설정, 마스킹, 2의 제곱에 대한 곱셈 및 나눗셈을 포함합니다. 이들 작업의 규칙은 8비트 및 16비트 프로세서 시절부터 확립되었습니다.
signed 유형의 시프트에서 자주 실수하는데, 결과는 구현에 따라 달라지며(산술 시프트 또는 논리 시프트), 또한 타입의 크기를 초과하는 경우 문제가 발생합니다. 오류의 결과로 데이터 손상, 잘못된 계산, 정의되지 않은 동작 등이 발생할 수 있습니다.
좌측 시프트 (<<): 값에 2의 k 제곱을 곱하는 것과 같습니다(a << k). 항상 오른쪽에 0을 채웁니다.
우측 시프트 (>>): unsigned 값의 경우 왼쪽에 0으로 채워지고(논리 시프트), signed의 경우에는 부호 비트로 채워지거나(산술 시프트) 0으로 채워질 수 있습니다(구현에 따라 다름).
예:
unsigned int x = 5; // 0000 0101 unsigned int y = x << 1; // 0000 1010 == 10 int z = -4; // 1111 1100 (8비트인 경우) int w = z >> 1; // 1111 1110 (-2) 또는 0111 1110 (구현에 따라 다름)
주요 특징:
음수의 비트 우측 시프트(>>)를 할 경우 어떻게 됩니까?
결과는 구현에 따라 다릅니다: 대부분의 경우 부호를 유지하는 산술 시프트가 적용되지만, 표준에서는 이를 보장하지 않습니다!
타입의 비트 수보다 더 많이 시프트하면 결과는 얼마입니까?
정의되지 않은 동작입니다. 예를 들어, 1 << 32는 32비트 타입의 경우 어떤 것이라도 될 수 있으며, 프로그램이 중단될 수도 있습니다.
부동 소수점 수에 비트 연산자를 사용할 수 있습니까?
아니요, 표준 float, double 타입은 비트 연산을 지원하지 않습니다. 오직 정수 타입만 가능합니다.
프로그래머가 마스크 생성을 위해 int를 32로 시프트했는데, 일부 플랫폼에서는 0이 되었고, 다른 플랫폼에서는 인식 불가능한 값이 되었습니다.
장점:
단점:
대신에 unsigned 값을 사용하고 비트 수를 매크로로 마스킹하며, 타입 길이를 sizeof로 확인하여 명확한 문서화가 이루어졌습니다.
장점:
단점: