비트 수준 연산자의 단점.
물어:
"는 비트 연산자 사용되지 않은 이유가 &
, |
그리고 ^
C에서 부울"값 ++에 대한 "는? ”
예, 논리 연산자 이며, 높은 수준의 부울 연산자 내장 !
, &&
그리고 ||
, 다음과 같은 장점을 제공합니다 :
보증 인수의 변환 에 bool
에 즉, 0
및 1
순서 값.
최종 결과가 알려지 자마자 표현식 평가가 중지되는 단락 평가를 보장 합니다. True , False 및 Indeterminate가
있는 트리 값 논리로 해석 될 수 있습니다 .
읽을 수있는 텍스트 등가물 not
, and
및 or
, 내가 직접 사용하지 않더라도.
댓글에 독자 안티몬 노트도 bitlevel 사업자가 다른 토큰을 가지고 즉 bitand
, bitor
, xor
와 compl
,하지만 내 생각에이보다 적은 읽을 수 and
, or
과 not
.
간단히 말해서, 상위 수준 연산자의 이러한 각 장점은 비트 수준 연산자의 단점입니다.
특히 비트 연산자는 0/1 로의 인수 변환이 없기 때문에 예를 들어 1 & 2
→ 0
, 반면 1 && 2
→ true
. 또한 ^
, 비트 배타적 또는이 방식으로 오작동 할 수 있습니다. 부울 값 1과 2는 동일 true
하지만 비트 패턴으로 간주되어 서로 다릅니다.
논리적으로 표현하는 방법 / 또는 C ++에서.
그런 다음 질문에 대한 약간의 배경 정보를 제공하고
"가끔 두 가지 조건 중 정확히 하나가 참 (XOR)이되기를 원하는 상황이 발생하기 때문에 ^ 연산자를 조건식에 넣습니다."
음, 비트 연산자는 논리 연산자 보다 우선 순위 가 높습니다 . 이것은 특히 다음과 같은 혼합 표현에서
a && b ^ c
아마도 예상치 못한 결과를 얻습니다. a && (b ^ c)
.
대신 쓰기
(a && b) != c
의미를 더 간결하게 표현합니다.
다중 인수의 경우 / 또는 작업을 수행하는 C ++ 연산자가 없습니다. 당신이 쓰는 예를 들어, a ^ b ^ c
보다 '중 하나라는 표현하지 a
, b
또는 c
사실이다 ". 대신은 말한다, "의 홀수 a
, b
및c
그들 또는 3의 1이 될 수있는, 참 ..."
일반 중 / 또는 표현하기 위해 a
, b
그리고 c
유형입니다 bool
, 단지 쓰기
(a + b + c) == 1
또는 bool
인수 가 아닌 경우 다음으로 변환하십시오 bool
.
(!!a + !!b + !!c) == 1
&=
부울 결과를 누적하는 데 사용 합니다.
당신은 더 정교하게
"나는 때때로 부울 값을 축적해야하고, &=
그리고 |=?
매우 유용 할 수 있습니다."
글쎄, 이것은 각각 모든 조건이 충족 되는지 또는 어떤 조건이 충족 되는지 확인하는 것과 일치 하며 de Morgan의 법칙 은 하나에서 다른 것으로 이동하는 방법을 알려줍니다. 즉, 그중 하나만 필요합니다. 원칙적으로 사용할 수 *=
있습니다.&&=
연산자 (조지 부울 (George Boole)이 발견 한 것처럼 논리적 AND는 매우 쉽게 곱셈으로 표현할 수 있음).하지만 나는 이것이 코드의 관리자를 혼란스럽고 오도 할 것이라고 생각합니다.
다음 사항도 고려하십시오.
struct Bool
{
bool value;
void operator&=( bool const v ) { value = value && v; }
operator bool() const { return value; }
};
#include <iostream>
int main()
{
using namespace std;
Bool a = {true};
a &= true || false;
a &= 1234;
cout << boolalpha << a << endl;
bool b = {true};
b &= true || false;
b &= 1234;
cout << boolalpha << b << endl;
}
Visual C ++ 11.0 및 g ++ 4.7.1을 사용한 출력 :
진실
그릇된
결과가 다른 이유는 비트 레벨 &=
이 bool
오른쪽 인수에 대한 변환을 제공하지 않기 때문입니다.
그렇다면이 결과 중 어떤 것을 사용하고 &=
싶습니까?
전자가이면 true
연산자 (예 : 위와 같이) 또는 명명 된 함수를 더 잘 정의하거나 오른쪽 표현식의 명시 적 변환을 사용하거나 전체 업데이트를 작성합니다.