2012-04-05 17 views
9

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?

risposta

15

Vorrei convertire a in un booleano utilizzando !!a, per ottenere 0 o 1. x = !!a.

Quindi lo negherei a due a complemento. Dato che non hai un unus meno disponibile, puoi utilizzare la definizione di negazione del complemento a 2: invertire i bit, quindi aggiungere uno: y = ~x + 1. Ciò fornirà tutti i bit chiari o tutti i bit impostati.

Quindi avrei and che direttamente con una variabile y & b, inverso con l'altra: ~y & c. Questo darà uno 0 per una delle espressioni e la variabile originale per l'altra. Quando abbiamo or insieme, lo zero non avrà alcun effetto, quindi otterremo la variabile originale, invariata.

+0

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

+0

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. –

+0

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' –

3

In altre parole, è necessario a avere tutti i bit impostati a 0, se a è false (cioè 0), e hanno tutti i bit impostato a 1, se è vero a (cioè a > 0).

Per il primo caso, il lavoro è già stato fatto per voi; per quest'ultimo - prova a calcolare il risultato dell'espressione ~!1.

+0

beh, questo è quello che pensavo all'inizio. ~! 1 darebbe tutti quelli che è perfetto. Tuttavia, se dovessi fare ~! A, e a = 0, allora ~! 0 mi darebbe 1110, quindi non sono sicuro di cosa fare da qui /: – atb

Problemi correlati