Sto lavorando ad un compito a casa dove dovremmo fare una funzione chiamata isGreater (x, y) che restituisce se x è più grande di y, ma possiamo usare solo operatori bitwise insieme a + e!. Ho già risolto il problema, usando la regola se x e y hanno segni diversi, quindi x> = 0 e y < 0 o se x e y hanno lo stesso segno allora solo se y-x è negativo.Perché funziona più in alto della funzione?
Tuttavia, quando mi sono guardato intorno come gli altri lo hanno risolto, ho notato il seguente metodo che funziona correttamente per qualsiasi motivo.
y = ~y;
return !(((x&y) + ((x^y) >> 1)) >> 31);
non posso per la vita di me capire perché questo funziona, immagino che questo ha qualcosa a che fare con il primo bit x che non è impostato in Y o qualcosa del genere?
Nota: Apparentemente questa è solo una soluzione valida se x e y sono int, non int unsigned.
Ciò è consentito, insieme al! operatore. La soluzione è perfettamente valida. – jamiees2
Mi dispiace, ho fatto un errore non includendo il + e! operatori. – jamiees2
Se non sbaglio, se x è 1 ey è 1, restituisce 1. Quindi la funzione dovrebbe essere 'isGreaterOrEqual (x, y)'? – indiv