최신 CodeProject 뉴스 레터를 읽은 후 비트 연산에 대한이 기사를 보았습니다 . 흥미로운 독서가 가능하며 정수가 짝수인지 홀수인지 확인하지만 n 번째 비트가 설정되어 있는지 테스트하는 이점을 확실히 알 수 있습니까? 이것의 장점은 무엇입니까?
최신 CodeProject 뉴스 레터를 읽은 후 비트 연산에 대한이 기사를 보았습니다 . 흥미로운 독서가 가능하며 정수가 짝수인지 홀수인지 확인하지만 n 번째 비트가 설정되어 있는지 테스트하는 이점을 확실히 알 수 있습니까? 이것의 장점은 무엇입니까?
답변:
비트 단위 연산은 임베디드 시스템에서 하드웨어 레지스터를 프로그래밍 할 때 반드시 필요합니다. 예를 들어, 내가 사용한 모든 프로세서에는 인터럽트의 활성화 여부를 제어하는 하나 이상의 레지스터 (일반적으로 특정 메모리 주소)가 있습니다. 인터럽트가 일반적인 프로세스를 시작하게하려면 레지스터의 다른 비트를 수정하지 않으면 서 해당 인터럽트 유형에 대한 활성화 비트를 설정하는 것이 가장 중요합니다.
인터럽트가 발생하면 일반적으로 단일 서비스 루틴이 인터럽트의 정확한 이유를 결정할 수 있도록 상태 레지스터에 비트를 설정합니다. 개별 비트를 테스트하면 인터럽트 소스를 빠르게 디코딩 할 수 있습니다.
많은 임베디드 시스템에서 사용 가능한 총 RAM은 64, 128 또는 256 바이트 (즉, 킬로바이트 또는 메가 바이트가 아닌 바이트) 일 수 있습니다.이 환경에서는 1 바이트를 사용하여 여러 데이터 항목, 부울 플래그 등을 저장 한 다음 비트 연산을 사용하는 것이 일반적입니다. 설정하고 읽을 수 있습니다.
나는 수년 동안 메시지 페이로드가 10.5 바이트 인 위성 통신 시스템과 협력 해 왔습니다. 이 데이터 패킷을 최대한 활용하려면 필드 사이에 사용하지 않는 비트를 남기지 않고 정보를 데이터 블록에 압축해야합니다. 즉, 비트 및 시프트 연산자를 광범위하게 사용하여 정보 값을 가져와 전송중인 페이로드에 포장합니다.
기본적으로 크기와 속도를 고려하여 사용합니다. 비트 단위 연산은 매우 간단하므로 일반적으로 산술 연산보다 빠릅니다. 예를 들어, rgb 값의 녹색 부분을 얻으려면 산술 접근 방식은 (rgb / 256) % 256
입니다. 비트 연산을 사용하면 다음과 같은 작업을 수행 할 수 있습니다 (rgb >> 8) & 0xFF
. 후자는 상당히 빠르며 익숙해지면 더 쉽습니다. 일반적으로 데이터를 압축하고 빠른 방식으로 인코딩 / 디코딩해야 할 때 비트 단위 연산이 많이 사용됩니다.
BYTE g1 = (rgb / 256) % 256;
00E51013...C1 E9 08...shr ecx,8
00E51016...88 0C 24...mov byte ptr [esp],cl
이러한 종류의 작업은 메모리 또는 CPU 전원이 제한되는 내장 시스템에 쓸 때 자주 사용됩니다.
예를 들어, 공간을 절약하기 위해 각 비트를 사용하여 부울을 표시하여 여러 변수를 단일 8 비트 int 변수에 저장할 수 있습니다. 그런 다음 특정 비트를 설정하거나 비트 값을 검색하는 빠른 방법이 필요합니다.
일반적으로 기가 바이트의 메모리가있는 데스크탑 PC에서 C #과 같은 고급 언어로 프로그래밍 할 때 각각 bool
이 전체 바이트를 차지하도록 신경 쓰지 않아도 됩니다. 그러나 C에서 2kb의 메모리로 마이크로 컨트롤러를 프로그래밍하는 경우 모든 단일 비트가 계산되므로 8 개의 bool을 단일 바이트로 묶는 기능이 중요 할 수 있습니다.
[Flags]
사용할 수 있는 속성이 있습니다 Enum
. 예를 들어, Font
갖는다 Style
굵은 이탤릭체, 밑줄 및 취소를 포함하는 비트 필드 속성.
비트 단위 연산은 내장 전자 장치와 같은 이유로 비디오 및 오디오 코덱에서도 자주 사용됩니다. 5 개의 플래그와 11 비트 타이머를 1/2 int로 압축하는 것은 매우 효율적인 비디오 코덱을 만들 때 매우 유용합니다.
실제로 MPEG 4는 가변 비트 길이 필드에 대해 지수 Golomb 인코딩 을 사용 합니다. 마지막 패킷의 너비가 17 비트 또는 19 비트 인 경우이 패킷의 너비는 3 비트 또는 5 비트 일 수 있습니다. 비트 단위 연산으로 모든 것을 알아낼 수 있습니다.
비트 논리 연산, 비트 시프트 연산 및 산술 연산을 결합한 트릭은 논리 게이트를 사용하여 이진 가산기의 구성을 연구 한 사람들이 이해할 수 있습니다. 그 범위를 벗어나면 자세한 설명 없이는 이해하기가 매우 어렵습니다.
SIMD 장치를 프로그래밍 할 때 특히 유용합니다 . 특히 CPU 아키텍처에서 일부 다른 SIMD 명령이 에뮬레이션 될 수 있기 때문에 일부 SIMD 명령을 의도적으로 생략 한 경우에 유용 합니다.
예를 들어, 아키텍처는 16 바이트 그룹의 음수 값을 취하기위한 명령어를 정의하지 않을 수 있지만 비트 단위로 무시하고 1을 더하여 에뮬레이션 할 수 있습니다. 마찬가지로 빼기를 생략하여도 에뮬레이션 할 수 있습니다. 두 번째 피연산자의 음수 "대체 경로"의 가용성은 특정 지침을 생략하는 이유입니다.
마찬가지로 SIMD는 16 비트, 32 비트 또는 64 비트와 같은 더 넓은 요소에 대한 추가를 구현하지 않고 병렬 8 비트 추가 만 지원할 수 있습니다. 이를 에뮬레이트하려면 8 비트 계산 결과에서 부호 비트를 추출한 후 다음 요소에서 캐리 작업을 수행해야합니다.
데이터 패킹, 빠른 연산 (곱셈, 나눗셈 및 모듈러스는 2의 거듭 제곱에 비해 크게 빨라짐), 비트 뒤집기 등을 배우십시오. 데이터를 배우고 사용을 시작하면 천천히 자신의 장점을 대부분 볼 수 있습니다.