Precedenza e operazioni di maschera di bit


94

Mi sono imbattuto in un caso (apparentemente) molto strano.

Prendi il numero 2 ( 0b10) e mascheralo con 1 ( 0b01)

Questo dovrebbe produrre 0b00che è equivalente a 0.

Tuttavia, ecco dove entra in gioco il signor Schrödinger:

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

Whisky. Tango. Foxtrot.

Certo, non sono il più acuto quando si tratta di operatori bit per bit, quindi forse ho sbagliato orribilmente, orribilmente da qualche parte?

Tuttavia, in Python:

0b10 & 0b01 == 0 = True

0b10 & 0b01 != 0 = False

...così?


Non in PHP ma in C, C ++ potresti semplicemente scrivere comevar_dump(!(0b10 & 0b01))
Grijesh Chauhan

2
Qualcosa di più strano però: 0b0+1restituisce 2in alcune versioni, a causa di un bug del parser.
Lily Chung

Risposte:


150

In realtà stai facendo questo:

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

Provare:

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

6
Mi sembra che PHP abbia la precedenza degli operatori di rete in generale.
Alvin Wong

23
Immagino sia per questo che non mi affido MAI alla precendenza in nessuna lingua. Inoltre, penso che le parentesi rendano il codice più leggibile. In casi estremi potresti voler (ri) raggruppare e commentare brevemente le cose.
Nessuna risposta il

2
@AlvinWong Hai ragione! Penso che raramente un codice abbia bisogno di un'espressione condizionale come il 0b10 & (0b01 == 0)motivo per cui qualcuno dovrebbe applicare bit per bit con sì nessun tipo di informazione.
Grijesh Chauhan

4
Bene, considera un esempio più comune: l'operatore ternario, PHP lo ha all'indietro, rendendolo diverso da tutti gli altri linguaggi. Rif: phpsadness
Alvin Wong

5
Ecco perché in C e C ++ le persone hanno avvisi per queste cose.
PlasmaHH
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.