2010-04-18 17 views
5

Ho cercato di risolvere questo problema per un po ', ma non ho potuto con operatori aritmetici e bit a bit interi. Tuttavia, penso che sia possibile e dovrebbe essere abbastanza facile. Cosa mi manca?Il modo più veloce per calcolare una maschera di bit X-bit?

Il problema: per ottenere un valore intero di lunghezza arbitraria (questo non è rilevante per il problema) con la sua X bit meno significativi set a 1 e il resto a 0. Ad esempio, dato il numero 31, I è necessario ottenere un valore intero uguale a 0x7FFFFFFF (31 bit meno significativi sono 1 e gli zeri restanti).

Ovviamente, l'utilizzo di un ciclo OR di un 1 spostato su un numero intero X volte farà il lavoro. Ma questa non è la soluzione che sto cercando. Dovrebbe essere più nella direzione di (X << Y - 1), quindi senza loop.

risposta

6

Prova questo: (1 < < X) - 1

+0

Non dovrebbe, a patto che lanci 1 su uint prima (non so C#, quindi non so come). Quindi verrà valutato su 0 - 1, ovvero 32 1 su una macchina a 32 bit. – doublep

+0

Hai la soluzione che stavo cercando. Semplice e lineare, senza loop. E quando X è uguale alla lunghezza del bit del numero intero, tutti i bit diventano 1 come previsto. Funziona anche con la minuscola dove X = 0. Grazie. – Virtlink

0

penso che il seguente dovrebbe funzionare:

int mask = (int)Math.Pow(2, 31) - 1; 

Si tratta di una singola espressione matematica, ma non è particolarmente efficiente in quanto il calcolo della potenza in questo modo non è davvero una buona idea. Tuttavia, dal momento che stiamo calcolando una potenza di 2, siamo in grado di fare la stessa cosa con spostamento:

int mask = (1 << 31) - 1; 
+0

Coinvolgere numeri in virgola mobile e una conversione in 'int' probabilmente non è più" veloce "... – Joey

+0

Sì, mi sono reso conto di come correggerlo subito dopo aver postato la versione iniziale, ma nel frattempo, @doublep già ha pubblicato quella soluzione. Penso che lascerò qui la mia versione in quanto spiega il processo di pensiero che mi ha portato lì :-). –

2

Prova questa:

uint.MaxValue >> (32 - something) 
Problemi correlati