[bit-manipulation] 실제 프로젝트에서 비트 시프 팅을 사용해야했던 적이 있습니까?

실제 프로그래밍 프로젝트에서 비트 시프 팅 을 사용해야했던 적이 있습니까? 대부분의 (모두는 아니지만) 고급 언어에는 시프트 연산자가 있지만 실제로 언제 사용해야합니까?



답변

나는 여전히 하드웨어에서 부동 소수점을 지원하지 않는 시스템에 대한 코드를 작성합니다. 이러한 시스템에서는 거의 모든 산술에 대해 비트 시프 팅이 필요합니다.

또한 해시를 생성하려면 시프트가 필요합니다. 다항식 산술 (CRC, 리드 솔로몬 코드가 주류 응용 프로그램 임) 또는 시프트도 사용합니다.

그러나 시프트는 편리하고 작가가 의도 한 바를 정확하게 표현하기 때문에 사용됩니다. 원하는 경우 곱셈을 사용하여 모든 비트 시프트를 에뮬레이트 할 수 있지만 작성하기가 더 어렵고 가독성이 떨어지고 때로는 느립니다.

컴파일러는 곱셈을 시프트로 줄일 수있는 경우를 감지합니다.


답변

예, 많이 사용했습니다. 비트 트위들 링은 비트 마스크가 매우 일반적인 임베디드 하드웨어에서 중요합니다. 마지막 모든 성능이 필요할 때 게임 프로그래밍에서도 중요합니다.

편집 : 또한 색상 심도를 변경하거나 RGB <-> BGR을 변환하는 등 비트 맵을 조작하는 데 많이 사용합니다.


답변

  • 열거 형에 대한 멋진 플래그 값 만들기 (수동으로 1, 2, 4를 입력하는 대신 …)
  • 비트 필드에서 데이터 압축 풀기 (많은 네트워크 프로토콜에서 사용)
  • Z- 커브 횡단
  • 성능 해킹

그리고 나는 그들이 사용되는 많은 경우를 생각할 수 없습니다. 일반적으로 다른 방법입니다. 특정 문제가 있으며 비트 연산을 사용하면 최상의 결과를 얻을 수 있습니다 (일반적으로 성능-시간 및 / 또는 공간 측면에서).


답변

내가 항상 사용하는 한 곳은 크로스 플랫폼 애플리케이션을 위해 정수의 엔디안을 전치 할 때입니다. 2D 그래픽을 블리 팅 할 때 (다른 비트 조작 연산자와 함께) 때때로 유용합니다.


답변

나는 그것들을 몇 번 사용했지만 거의 항상 바이너리 파일 형식을 구문 분석하는 데 사용되었습니다.


답변

비트 시프트가 빠릅니다. 분할 및 모듈러스 연산이 수행되기 훨씬 전에 CPU 명령 세트에서 구현되었습니다. 우리 중 많은 사람들이 연필과 종이로는 간단하지만 CPU에서는 사용할 수없는 산술에 비트 시프트를 사용했습니다.

예를 들면 :

  • 나는 큰 합성물을 소인수로 분해하는 것과 관련된 프로젝트에 비트 시프트를 사용했습니다.
  • 또한 임의로 큰 정수의 제곱근과 세제곱근을 찾기 위해 비트 시프트를 사용했습니다.


답변

예, 여전히 필요합니다.

예를 들어 여기서는 직렬 포트 COMx를 통해 PLC와 통신하기위한 소프트웨어를 개발합니다. 한 바이트 내에서 비트를 처리 할 필요가 있으며, 왼쪽 / 오른쪽 시프트, 논리 연산자 OR, XOR, AND를 매일 사용합니다.

예를 들어, 바이트의 비트 3 (오른쪽에서 왼쪽)을 켜야한다고 가정 해 보겠습니다.

다음을 수행하는 것이 훨씬 더 효율적입니다.

Byte B;

B := B XOR 4;

대신에:

Byte B = 0;
String s;  // 0 based index

s = ConvertToBinary (B);
s[5] = "1";
B := ConvertToDecimal (s);

문안 인사.