[language-agnostic] 비트 연산자의 실제 사용 사례 [닫기]

다음 비트 연산자의 실제 사용 사례는 무엇입니까?

  • XOR
  • 아니
  • 또는
  • 왼쪽 / 오른쪽 이동


답변

  • 비트 필드 (플래그)
    여러 “예 또는 아니오”속성으로 상태가 정의 된 것을 나타내는 가장 효율적인 방법입니다. ACL이 좋은 예입니다. 4 개의 개별 권한 (읽기, 쓰기, 실행, 정책 변경)을 말한 경우이를 낭비보다 1 바이트로 저장하는 것이 좋습니다. 추가 편의를 위해 여러 언어로 열거 유형에 맵핑 할 수 있습니다.

  • 포트 / 소켓을 통한 통신
    은 항상 체크섬, 패리티, 정지 비트, 흐름 제어 알고리즘 등을 포함합니다. 매체는 1 비트 만 전송할 수 있기 때문에 일반적으로 숫자 값이 아닌 개별 바이트의 논리 값에 의존합니다. 시간.

  • 압축, 암호화이
    두 가지 모두 비트 알고리즘에 크게 의존합니다. 예제 는 deflate 알고리즘을 살펴보십시오. 모든 것이 바이트가 아니라 비트 단위입니다.

  • 유한 상태 머신
    소프트웨어에서도 찾을 수 있지만 주로 하드웨어에 내장 된 종류를 말합니다. 이들은 자연에서 조합 – 그들은 말 그대로 논리 게이트의 무리에 아래로 “컴파일”점점 될 수있다, 그들은 다음과 같이 표현 될 필요가 있으므로 AND, OR, NOT, 등

  • 그래픽
    이 연산자가 그래픽 프로그래밍에 사용되는 모든 영역에 들어갈 공간이 충분하지 않습니다. XOR(또는 ^)는 동일한 입력을 두 번 적용하면 첫 번째가 실행 취소되므로 여기에서 특히 흥미 롭습니다. 이전 GUI는 값 비싼 다시 그리기의 필요성을 제거하기 위해 선택 강조 표시 및 기타 오버레이에이 방법을 사용했습니다. 느린 그래픽 프로토콜 (예 : 원격 데스크톱)에 여전히 유용합니다.

그것들은 내가 생각해 낸 처음 몇 가지 예일뿐입니다.


답변

이상한가요?

(value & 0x1) > 0

2로 나눌 수 있습니까?

(value & 0x1) == 0


답변

다음은 개별 비트로 저장된 플래그를 다루는 일반적인 관용구입니다.

enum CDRIndicators {
  Local = 1 << 0,
  External = 1 << 1,
  CallerIDMissing = 1 << 2,
  Chargeable = 1 << 3
};

unsigned int flags = 0;

청구 가능 플래그를 설정하십시오.

flags |= Chargeable;

CallerIDMissing 플래그 지우기 :

flags &= ~CallerIDMissing;

CallerIDMissing 및 Chargeable이 설정되어 있는지 테스트하십시오.

if((flags & (CallerIDMissing | Chargeable )) == (CallerIDMissing | Chargeable)) {

}


답변

CMS의 보안 모델을 구현할 때 비트 단위 연산을 사용했습니다. 적절한 그룹에 있으면 사용자가 액세스 할 수있는 페이지가 있습니다. 사용자는 여러 그룹에 속할 수 있으므로 사용자 그룹과 페이지 그룹간에 교차가 있는지 확인해야했습니다. 따라서 각 그룹에 고유 한 2의 거듭 제곱 식별자를 할당했습니다. 예 :

Group A = 1 --> 00000001
Group B = 2 --> 00000010
Group C = 3 --> 00000100

이 값들을 함께 OR하고 값을 페이지와 함께 단일 int로 저장합니다. 예를 들어 그룹 A & B가 페이지에 액세스 할 수있는 경우 페이지 액세스 제어로 값 3 (2 진은 00000011)을 저장합니다. 거의 같은 방식으로 ORed 그룹 식별자 값을 사용자와 함께 저장하여 그룹을 나타냅니다.

따라서 지정된 사용자가 주어진 페이지에 액세스 할 수 있는지 확인하려면 값을 함께 AND하고 값이 0이 아닌지 확인하면됩니다. 이 검사는 단일 명령, 루핑, 데이터베이스 왕복없이 구현되므로 매우 빠릅니다.


답변

저수준 프로그래밍이 좋은 예입니다. 예를 들어, 일부 하드웨어가 원하는 작업을 수행하도록 메모리 매핑 된 레지스터에 특정 비트를 작성해야 할 수 있습니다.

volatile uint32_t *register = (volatile uint32_t *)0x87000000;
uint32_t          value;
uint32_t          set_bit   = 0x00010000;
uint32_t          clear_bit = 0x00001000;

value = *register;            // get current value from the register
value = value & ~clear_bit;   // clear a bit
value = value | set_bit;      // set a bit
*register = value;            // write it back to the register

또한, htonl()htons()사용하여 구현 &하고 |(그 시스템에 연산자를 엔디안 (바이트 순서) 네트워크 순서와 일치하지 않습니다)

#define htons(a) ((((a) & 0xff00) >> 8) | \
                  (((a) & 0x00ff) << 8))

#define htonl(a) ((((a) & 0xff000000) >> 24) | \
                  (((a) & 0x00ff0000) >>  8) | \
                  (((a) & 0x0000ff00) <<  8) | \
                  (((a) & 0x000000ff) << 24))


답변

예를 들어 팩 색상 값에서 RGB (A) 값을 가져 오는 데 사용합니다.


답변

부울 플래그가 많으면 모두 int에 저장하는 것을 좋아합니다.

비트 단위 AND를 사용하여 가져옵니다. 예를 들면 다음과 같습니다.

int flags;
if (flags & 0x10) {
  // Turn this feature on.
}

if (flags & 0x08) {
  // Turn a second feature on.
}

기타