비트 단위 연산을 사용하면 어떤 이점이 있습니까? [닫은]


19

최신 CodeProject 뉴스 레터를 읽은 후 비트 연산에 대한이 기사를 보았습니다 . 흥미로운 독서가 가능하며 정수가 짝수인지 홀수인지 확인하지만 n 번째 비트가 설정되어 있는지 테스트하는 이점을 확실히 알 수 있습니까? 이것의 장점은 무엇입니까?

답변:


27

비트 단위 연산은 임베디드 시스템에서 하드웨어 레지스터를 프로그래밍 할 때 반드시 필요합니다. 예를 들어, 내가 사용한 모든 프로세서에는 인터럽트의 활성화 여부를 제어하는 ​​하나 이상의 레지스터 (일반적으로 특정 메모리 주소)가 있습니다. 인터럽트가 일반적인 프로세스를 시작하게하려면 레지스터의 다른 비트를 수정하지 않으면 서 해당 인터럽트 유형에 대한 활성화 비트를 설정하는 것이 가장 중요합니다.

인터럽트가 발생하면 일반적으로 단일 서비스 루틴이 인터럽트의 정확한 이유를 결정할 수 있도록 상태 레지스터에 비트를 설정합니다. 개별 비트를 테스트하면 인터럽트 소스를 빠르게 디코딩 할 수 있습니다.

많은 임베디드 시스템에서 사용 가능한 총 RAM은 64, 128 또는 256 바이트 (즉, 킬로바이트 또는 메가 바이트가 아닌 바이트) 일 수 있습니다.이 환경에서는 1 바이트를 사용하여 여러 데이터 항목, 부울 플래그 등을 저장 한 다음 비트 연산을 사용하는 것이 일반적입니다. 설정하고 읽을 수 있습니다.

나는 수년 동안 메시지 페이로드가 10.5 바이트 인 위성 통신 시스템과 협력 해 왔습니다. 이 데이터 패킷을 최대한 활용하려면 필드 사이에 사용하지 않는 비트를 남기지 않고 정보를 데이터 블록에 압축해야합니다. 즉, 비트 및 시프트 연산자를 광범위하게 사용하여 정보 값을 가져와 전송중인 페이로드에 포장합니다.


4
자세한 부울 비트 운영 및 최적화에 관심있는 사람들을 위해, 해커의 기쁨에 봐 amazon.com/Hackers-Delight-Henry-S-Warren/dp/0201914654
gablin

7

기본적으로 크기와 속도를 고려하여 사용합니다. 비트 단위 연산은 매우 간단하므로 일반적으로 산술 연산보다 빠릅니다. 예를 들어, rgb 값의 녹색 부분을 얻으려면 산술 접근 방식은 (rgb / 256) % 256입니다. 비트 연산을 사용하면 다음과 같은 작업을 수행 할 수 있습니다 (rgb >> 8) & 0xFF. 후자는 상당히 빠르며 익숙해지면 더 쉽습니다. 일반적으로 데이터를 압축하고 빠른 방식으로 인코딩 / 디코딩해야 할 때 비트 단위 연산이 많이 사용됩니다.


2
BYTE g1 = (rgb / 256) % 256; 00E51013...C1 E9 08...shr ecx,8 00E51016...88 0C 24...mov byte ptr [esp],cl
rwong

4

이러한 종류의 작업은 메모리 또는 CPU 전원이 제한되는 내장 시스템에 쓸 때 자주 사용됩니다.

예를 들어, 공간을 절약하기 위해 각 비트를 사용하여 부울을 표시하여 여러 변수를 단일 8 비트 int 변수에 저장할 수 있습니다. 그런 다음 특정 비트를 설정하거나 비트 값을 검색하는 빠른 방법이 필요합니다.

일반적으로 기가 바이트의 메모리가있는 데스크탑 PC에서 C #과 같은 고급 언어로 프로그래밍 할 때 각각 bool 이 전체 바이트를 차지하도록 신경 쓰지 않아도 됩니다. 그러나 C에서 2kb의 메모리로 마이크로 컨트롤러를 프로그래밍하는 경우 모든 단일 비트가 계산되므로 8 개의 bool을 단일 바이트로 묶는 기능이 중요 할 수 있습니다.


.NET에는 비트 필드로 [Flags]사용할 수 있는 속성이 있습니다 Enum. 예를 들어, Font갖는다 Style굵은 이탤릭체, 밑줄 및 취소를 포함하는 비트 필드 속성.
deltreme

@deltreme. 네, [Flags]를 사용할 수 있다는 것을 알고 있지만 그게 요점이 아닙니다. 요점은 고급 언어에서는 몇 개의 부울에 몇 바이트의 공간을 사용하는 것에 대해 신경 쓰지 않는다는 것입니다. 일반적으로 유지 관리 성과 코드 가독성에 더 관심이 있습니다. 크기를 걱정하는 임베디드 시스템에서는 .net [Flags] 속성과 같은 항목에 액세스 할 수 없으므로 이러한 비트 단위 연산을 사용할 수 있습니다.
Simon P Stevens

"그러나 n 번째 비트가 설정되어 있는지 테스트합니까? 이것의 장점은 무엇입니까?" 그래서 요점입니다. 그러나 지정된 언어가 없으므로 C #이 언급 된 답변에 대한 의견으로 입력하기로 결정했습니다. 그것은 당신의 대답에 대한 의견이 아니며, 추가 또는 알기 쉬운 것입니다.
deltreme

@deltreme : 오, 멋지다.
Simon P Stevens

3

비트 단위 연산은 내장 전자 장치와 같은 이유로 비디오 및 오디오 코덱에서도 자주 사용됩니다. 5 개의 플래그와 11 비트 타이머를 1/2 int로 압축하는 것은 매우 효율적인 비디오 코덱을 만들 때 매우 유용합니다.

실제로 MPEG 4는 가변 비트 길이 필드에 대해 지수 Golomb 인코딩 을 사용 합니다. 마지막 패킷의 너비가 17 비트 또는 19 비트 인 경우이 패킷의 너비는 3 비트 또는 5 비트 일 수 있습니다. 비트 단위 연산으로 모든 것을 알아낼 수 있습니다.


2

비트 논리 연산, 비트 시프트 연산 및 산술 연산을 결합한 트릭은 논리 게이트를 사용하여 이진 가산기의 구성을 연구 한 사람들이 이해할 수 있습니다. 그 범위를 벗어나면 자세한 설명 없이는 이해하기가 매우 어렵습니다.

SIMD 장치를 프로그래밍 할 때 특히 유용합니다 . 특히 CPU 아키텍처에서 일부 다른 SIMD 명령이 에뮬레이션 될 수 있기 때문에 일부 SIMD 명령을 의도적으로 생략 한 경우에 유용 합니다.

예를 들어, 아키텍처는 16 바이트 그룹의 음수 값을 취하기위한 명령어를 정의하지 않을 수 있지만 비트 단위로 무시하고 1을 더하여 에뮬레이션 할 수 있습니다. 마찬가지로 빼기를 생략하여도 에뮬레이션 할 수 있습니다. 두 번째 피연산자의 음수 "대체 경로"의 가용성은 특정 지침을 생략하는 이유입니다.

마찬가지로 SIMD는 16 비트, 32 비트 또는 64 비트와 같은 더 넓은 요소에 대한 추가를 구현하지 않고 병렬 8 비트 추가 만 지원할 수 있습니다. 이를 에뮬레이트하려면 8 비트 계산 결과에서 부호 비트를 추출한 후 다음 요소에서 캐리 작업을 수행해야합니다.


0

데이터 패킹, 빠른 연산 (곱셈, 나눗셈 및 모듈러스는 2의 거듭 제곱에 비해 크게 빨라짐), 비트 뒤집기 등을 배우십시오. 데이터를 배우고 사용을 시작하면 천천히 자신의 장점을 대부분 볼 수 있습니다.


1
그것은 다소 직교하는 대답입니다.
itsbruce
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.