비트 OR 또는 플래그 추가


16

다른 사람들이 Bitwise-OR을 사용하여 전에 플래그를 결합하는 것을 보았습니다.

#define RUN 0x01
#define JUMP 0x02
#define SHOOT 0x04

const byte madPerson = RUN | JUMP | SHOOT;

그것은 또한 내가하는 방식입니다.

그러나 나는 또한 add를 사용하여 (많지 않은) 결합 플래그를 보았습니다.

#define RUN 0x01
#define JUMP 0x02
#define SHOOT 0x04

const byte madPerson = RUN + JUMP + SHOOT;

어느 쪽이 더 "판독 가능"합니까? (어느 사람이 더 많이 인식 할 것이라고 생각하십니까?)이를 수행하는 "표준"방법은 무엇입니까? 어느 것을 더 선호 해?


이것은 SO 질문입니다. 1<<0,, 1<<1등을 사용해보십시오 1<<2. 플래그가 많으면 읽기 쉽고 유지 관리가 쉬우 며 오류가 발생하기 쉽습니다. 예를 들어 64 비트 int의 64 비트를 모두 압축하는 경우 오타를 피하고 싶을 것입니다. :) 표현 방법 1도 중요합니다. VS2010의 64 비트 정수의 경우 그것이 1UI64또는 그와 비슷한 것으로 생각합니다 . 잘못된 유형을 사용하면 물릴 수 있습니다.
— Job

3
@ Job : 가독성, 인식 가능성, 환경 설정 및 모범 사례에 대해 질문하기 때문에 StackOverflow 질문이 아닙니다. 그것에 대한 객관적인 대답은 없습니다. 여기에 속합니다.
— Macneil

답변:


34

비트 OR.

추가는 위험합니다.

적기가 사람이고 화난 적기가 말하고 쏘는 적기를 예로 들어 봅시다. 나중에, 당신은 모든 도적을 쏴야한다고 결정하지만, 화난 도적 정의를 잊어 버렸고 사격 깃발을 제거하지는 않았다.

#define PERSON 1 << 0
#define SPEAKS 1 << 1
#define SHOOTS 1 << 2
#define INVINCIBLE 1 << 3
const byte bandit = PERSON | SHOOTS;                    // 00000101
const byte angryBandit_add = bandit + SPEAKS + SHOOTS;  // 00001011 error
const byte angryBandit_or = bandit | SPEAKS | SHOOTS;   // 00000111 ok

만약 당신이 angryBandit_add게임 을 사용 했다면 이제는 적을 죽이거나 죽일 수없는 화난 산적을 갖는 복잡한 논리 오류가 생길 것입니다.

angryBandit_or최악의 것을 사용했다면 중복 | SHOOTS입니다.

비슷한 이유로 비트 NOT은 플래그를 제거하는 빼기보다 안전합니다.


11

비트 OR은 의도를보다 명확하게 전달합니다.

또한 비트 단위 OR 이 더 효율적 이어야 합니다.


+1 실제로 OR은 이것이 플래그라는 것을 더 명확하게한다고 생각하지만 효율성에 관해서는 비트 연산이 느린 언어가 있습니다 (예 : JavaScript 모든 숫자는 64 부동 소수점입니다.
— Ivo Wetzel

1
OP의 예를 고려할 때 한 줄의 OR 또는 추가가 프로그램의 실행 속도에 부정적인 영향을 줄 것이라고 생각하지 않습니다.
— Tin Man

1
@Greg : 특히이 예제의 계산은 컴파일 타임에 수행되기 때문입니다. :-)
— Carson63000

의도를 전달하는 것 외에도 ADA, C #, Java를 포함하되 이에 국한되지 않는 많은 언어로 이것을 보는 것이 일반적입니다.
— Ken Henderson

2
"해야한다"는이 사업에서 매우 큰 단어입니다. 오늘이 문제가 발생할 가능성은 거의 없지만 비트 OR 명령이없는 프로세서에서 작업 한 것에 대한 기억이 있습니다. 하나의 명령으로 비트 단위 AND를 수행 할 수 있고, 하나의 명령어로 비트 XOR을 수행 할 수 있지만 비트 단위 OR은 비트를 해제하는 즉시 비트 단위 AND, 새로 지워진 비트를 보완하기 위해 즉시 비트 단위 XOR을 사용합니다. 물론 설정했습니다.
— John R. Strohm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.