Quindi vedo che questa domanda è già stata posta, tuttavia le risposte sono state un po 'vaghe e inutili. Va bene, ho bisogno di implementare un'espressione c utilizzando solo "&^~ + | >> < <!"Istruzione condizionale con operatori bit a bit
L'espressione deve assomigliare: un? B: c
Quindi, da quello che ho potuto dire, l'espressione deve essere simile:
return (a & b) | (~a & c)
Questo funziona quando a = 0, perché ANDing con b darà zero, e quindi l'espressione o restituirà il lato destro, (~a & c)
che funziona perché ~ 0 restituisce tutti e anding c con tutti i resi c.
Tuttavia, questo non funziona quando a> 0. Qualcuno può provare a spiegare perché questo è, o come risolverlo?
Questo è in realtà perfetto. Quindi, perché l'aggiunta di uno rende tutto il bit impostato o chiaro? Capisco perché ciò debba accadere, ma non capisco come ciò accada. – atb
Se iniziamo con 0, il ribaltamento dei bit restituisce tutti. Quando ne aggiungiamo uno, tutti tornano agli zeri (e il carry viene impostato, ma lo ignoriamo). Se iniziamo con 1, lanciando i bit si ottiene 111 ... 10. L'aggiunta di 1 trasforma l'ultimo 0 in un 1, quindi tutti i bit ora sono 1. –
la parte 'y = ~ x + 1' mi ha confuso; Alla fine ho capito che funziona a causa di overflow di interi nel caso in cui x = 0, ma non è ovvio. La soluzione più chiara per me era spostare prima lsb in msb con shift a sinistra (00000001 => 10000000) e quindi copiare msb con spostamento a destra: 'y = (x << 31) >> 31' –