2011-12-19 13 views
13

Dire, ho un numero intero come , vorrei disinserire il terzo bit per ottenere 10001; se ho 10001, otterrò comunque 10001; come posso ottenerlo?Come disinserire un bit specifico in un numero intero

unset(int i, int j) 
int i= 10101 or 10000 
int j = 00100 
+9

Puoi fare la tua mente sulla lingua? –

+2

Indicare in quale linguaggio di programmazione si sta * effettivamente * utilizzando. (Il "codice" nella tua domanda non è valido in nessuno di quelli con cui hai contrassegnato la domanda.) –

risposta

38

Supponendo che si sta l'indicizzazione bit da destra, questo dovrebbe funzionare per disinserire un particolare bit in value:

int mask = 1 << bitIndex; 
value &= ~mask; 

È possibile impostare il bit utilizzando codice simile:

value |= mask; 

dove mask è come prima. (Ciò presuppone che bit indicizzazione inizia da 0.)

0

In C e C++ utilizzare bit wise AND operator per formare una maschera AND:

10101 & 10001 
+0

Questo non è utile per disabilitare un bit arbitrario, dal momento che dovresti creare la maschera prima del tempo. –

+0

@QuinnTaylor: OP ** conosce ** il bit che desidera disinserire e specificamente lo dice nella Q, Dato che temo che il commento e il downvote siano solo rumore pedante. –

+0

Il problema con questa "soluzione" è che OP avrebbe già dovuto formare la maschera '10001', quando è esattamente ciò che l'OP sta cercando di calcolare.(Ho letto la domanda di OP come una domanda sul caso generale, quando non si conosce il valore effettivo di 'i' e tuttavia si vuole azzerare un particolare bit.) –

0

Bitwise functions.

In Java:

int num = 0b10101; 
int mask = 1 << bitPosition; 

System.out.println(Integer.toBinaryString(num)); 
num &= ~mask; 
System.out.println(Integer.toBinaryString(num)); 
+0

errato. Il tuo codice funziona solo per 'N = 3'. Il bit 'N'th è dato da' (1 << N) ', per' N = 0..'. Niente a che vedere con 'integerLength'. – EJP

+0

@EJP Ahh, era tardi quando stavo scrivendo questo, risolto. – Jeffrey

1

Se avete a che fare con litterals, allora si può solo lavorare con i numeri esadecimali. Convertire i modelli di bit in esadecimale numeri:

10101 => 0x15 
00100 => 0x04 

Così il seguente codice C avrebbe fissato b al risultato che si desidera.

int a = 0x15; 
int b = a & ~(0x04); 

Se si voleva qualcosa di generico si potrebbe avere una funzione C (con tutta la gamma checking rimosso) come

int clearBit(int value, int bit) 
{ 
    // Assume we count bits starting at 1 
    return value & ~(1 << (bit -1)); 
} 
10

Per cancellare o disinserire un po

Utilizzare il bit operatore AND (&) per cancellare un po '.

number &= ~(1 << x); 

Questo cancellerà il bit x. È necessario invertire la stringa di bit con l'operatore NOT bit a bit (~), quindi AND it.

NOTA: qui x è la posizione del bit che inizia da 0 a LSB.

0

È possibile attivare o disattivare il bit ennesima

risultato = numero^(1 < < BitIndex)

+1

La commutazione non si cancella. OP vuole che il bit rimanga 0 se è già 0. –

Problemi correlati