우선 순위 및 비트 마스크 작업


94

나는 (겉보기에) 매우 이상한 사건을 만났습니다.

숫자 2 ( 0b10)를 가져 와서 1 ( 0b01)로 비트 마스킹합니다.

이것은 0b000에 해당하는 것을 생성해야합니다 .

그러나 Schrödinger가 등장하는 곳은 다음과 같습니다.

var_dump(0b10 & 0b01); // int(0)
var_dump(0b10 & 0b01 == 0); // int(0)
var_dump(0b10 & 0b01 != 0); // int(0)

위스키. 탱고. 폭스 트롯.

나는 비트 연산자에 관해서 가장 예리하지 않다는 것을 인정합니다. 그래서 어딘가에 끔찍하고 끔찍하게 잘못되었을 수도 있습니다.

그러나 Python에서 :

0b10 & 0b01 == 0 = True

0b10 & 0b01 != 0 = False

...그래서?


내가 PHP에서하지만 C에서하지 않는, C ++ 당신은 간단하게 쓸 수var_dump(!(0b10 & 0b01))
Grijesh 차우

2
좀 더 이상한 점 : 파서 버그로 인해 일부 버전에서 0b0+1평가됩니다 2.
Lily Chung

답변:


150

당신은 실제로 이것을하고 있습니다 :

var_dump(0b10 & (0b01 == 0));
var_dump(0b10 & (0b01 != 0));

시험:

var_dump((0b10 & 0b01) == 0);
var_dump((0b10 & 0b01) != 0);

6
PHP가 전반적으로 연산자 우선 순위를 갖는 것 같습니다.
Alvin Wong

23
나는 그 이유의 추측 결코 어떤 언어로 precendence에 의존하고있다. 또한 괄호가 코드를 더 읽기 쉽게 만든다고 생각합니다. 극단적 인 경우에는 항목을 (재) 그룹화하고 짧은 주석을 달 수 있습니다.
무응답

2
@AlvinWong 맞습니다! 나는 0b10 & (0b01 == 0)왜 누군가가 예 아니오 종류의 정보로 비트 단위를 적용 하는 것과 같은 조건식이 코드에 거의 필요하지 않다고 생각 합니다.
Grijesh Chauhan 2014

4
더 일반적인 예를 고려해보십시오. 삼항 연산자 인 PHP는 역방향으로되어있어 다른 모든 언어와 다릅니다. 참고 : phpsadness
Alvin Wong

5
그렇기 때문에 C와 C ++에서 사람들은 이러한 것들에 대한 경고를받습니다.
PlasmaHH 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.