다음 비트 연산자의 실제 사용 사례는 무엇입니까?
- 과
- 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.
}
기타