비트 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.