Facile. Utilizza un AND bit a bit per confrontare il tuo numero con il valore 2^bitNumber, che può essere calcolato a buon mercato con lo spostamento dei bit.
//your black magic
var bit = (b & (1 << bitNumber-1)) != 0;
EDIT: Per aggiungere un po 'più in dettaglio perché ci sono un sacco di risposte simili senza alcuna spiegazione:
Un bit a bit e mette a confronto ogni numero, bit per bit, utilizzando una e si uniscono per produrre un numero che è la combinazione di bit in cui sono stati impostati sia il primo bit che il secondo bit in quel punto. Ecco la matrice logica della logica AND in un "bocconcino" che mostra il funzionamento di un AND bit per bit:
0101
& 0011
----
0001 //Only the last bit is set, because only the last bit of both summands were set
Nel tuo caso, si confronta il numero è stato superato con un numero che ha solo il bit che si desidera cercare per set. Diciamo che stai cercando il quarto bit:
11010010
& 00001000
--------
00000000 //== 0, so the bit is not set
11011010
& 00001000
--------
00001000 //!= 0, so the bit is set
Bit-shifting, per produrre il numero che vogliamo confrontare con, è esattamente quello che sembra: prendere il numero, rappresentato come un insieme di bit, e sposta quei bit a sinistra oa destra di un certo numero di punti. Poiché si tratta di numeri binari e quindi ogni bit è un potere-di-due maggiore di quello alla sua destra, lo spostamento dei bit verso sinistra equivale a raddoppiare il numero una volta per ogni punto spostato, equivalente a moltiplicare il numero per 2^x. Nel tuo esempio, alla ricerca del quarto bit, eseguiamo:
1 (2^0) << (4-1) == 8 (2^3)
00000001 << (4-1) == 00001000
Ora si sa come è fatto, quello che sta succedendo a livello basso, e perché funziona.
A causa di parentesi mancanti (precedenza operatore) questo codice non viene compilato, deve essere 'var bit = (b & (1 << bitNumber-1))! = 0'; – bitbonk