Öncelik ve bit maskesi işlemleri


94

(Görünüşe göre) çok garip bir vakayla karşılaştım.

2 numaralı (al 0b10() ve 1 ile bit maskesi 0b01)

Bu, 0b000'a eşdeğer olanı üretmelidir .

Ancak, Bay Schrödinger burada devreye giriyor:

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

Viski. Tango. Foxtrot.

Kuşkusuz, bitsel operatörler söz konusu olduğunda en keskin değilim - bu yüzden belki de bir yerlerde korkunç, korkunç bir şekilde yanılıyorum?

Ancak Python'da:

0b10 & 0b01 == 0 = True

0b10 & 0b01 != 0 = False

...yani?


PHP'de yok ama C, C ++ ile şöyle yazabilirsinizvar_dump(!(0b10 & 0b01))
— Grijesh Chauhan

2
Yine de daha tuhaf bir şey: bir ayrıştırıcı hatası nedeniyle bazı sürümlerde 0b0+1değerlendirilir 2.
— Lily Chung

Yanıtlar:


150

Aslında bunu yapıyorsun:

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

Deneyin:

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

6
Bana öyle geliyor ki, PHP genel olarak strnage operatörü önceliğine sahip.
— Alvin Wong

23
Sanırım bu yüzden hiçbir dilde öncülüğe ASLA güvenmiyorum. Dahası, parantezlerin kodu daha okunaklı hale getirdiğini düşünüyorum. Aşırı durumlarda, bir şeyleri (yeniden) gruplandırmak ve kısa yorum yapmak isteyebilirsiniz.
— Cevap yok

2
@AlvinWong Doğru söylüyorsun! Bence bir kod nadiren koşullu ifadeye ihtiyaç duyar 0b10 & (0b01 == 0).
— Grijesh Chauhan

4
Pekala, daha yaygın bir örnek düşünün: Üçlü operatör, PHP bunu geriye doğru taşır, bu da onu diğer tüm dillerden farklı kılar. Ref: phpsadness
— Alvin Wong

5
Bu yüzden C ve C ++ 'da insanlar bu şeyler için uyarılara sahipler.
— PlasmaHH
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.