Ho un incarico che chiede di fare una serie di funzioni solo con questi operatori:efficiente fare un int che ha un 1 ogni 1s, ma uno che è 0 soggiorno 0
! ~ &^| +
In alcuni dei problemi è utile rendere alcuni interi, x, diventano tutti 1 se contiene 1 se rimangono 0 se è 0. Il motivo per cui lo faccio è così che posso tornare yoz simili:
// One of the two conditional values is now 0
int conditionalA = mask&y;
int conditionalB = ~mask&z;
// One of the values is combined with 0 using |
int out = conditionalA|conditionalB;
return out;
dove feci maschera così:
// Make any x other than 0 all 1s
int mask = x;
mask |= mask>>1;
mask |= mask>>2;
mask |= mask>>4;
mask |= mask>>8;
mask |= mask>>16;
mask |= mask<<1;
mask |= mask<<2;
mask |= mask<<4;
mask |= mask<<8;
mask |= mask<<16;
ci deve essere un modo migliore per rendere maschera tutti 1s o 0s ma non può pensare ad una più efficiente soluzione. Anche in questo caso, è importante che resti 0 0 se x è 0.
Edit: se le dichiarazioni non sono un'opzione
Immagino che non sia possibile utilizzare le costanti letterali? – Jack
Potrei, ma con ulteriori restrizioni (permesso solo di scrivere numeri tra 0x0 - 0xff e shift se hanno bisogno di essere più grandi). Non vedo come potrebbero essere d'aiuto anche se – asimes
Dai una sbirciatina a questa raccolta di hack che girano a piccoli passi: http://graphics.stanford.edu/~seander/bithacks.html – vonbrand