2011-12-19 12 views
13

Digamos, tengo un número entero como , me gustaría desarmar el tercer bit para obtener 10001; si tengo 10001, seguiré recibiendo 10001; ¿Cómo puedo lograrlo?Cómo desarmar un bit específico en un entero

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

¿Se puede tomar una decisión sobre la lengua? –

+2

Por favor díganos qué lenguaje de programación es * en realidad * usando. (El "código" en su pregunta no es válido en ninguno de los que etiquetó la pregunta). –

Respuesta

38

Suponiendo que usted está indexando bits de la derecha, esto debería funcionar para desarmar un particular, bit en value:

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

puede configurar el poco uso de un código similar:

value |= mask; 

donde mask es como antes. (Esto supone que poco indexación comienza en 0.)

0

en C y C++ utilizar bit wise AND operator para formar una máscara AND:

10101 & 10001 
+0

Esto no es útil para desarmar un bit arbitrario, ya que tendría que crear la máscara antes de tiempo. –

+0

@QuinnTaylor: OP ** sabe ** la parte que quiere desarmar y específicamente lo dice en la Q, dado que me temo que el comentario y el downvote son solo ruido pedante. –

+0

El problema con esta "solución" es que OP ya habría tenido que formar la máscara '10001', cuando eso es precisamente lo que OP está tratando de calcular.(Leí la pregunta de OP como preguntando sobre el caso general, cuando uno no sabe el valor real de 'i' y aún quiere poner a cero un bit en particular.) –

0

Bitwise functions.

En Java:

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

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

Incorrecto. Tu código solo funciona para 'N = 3'. El bit 'N'th viene dado por' (1 << N) ', para' N = 0.'. Nada que ver con 'integerLength'. – EJP

+0

@EJP Ahh, era tarde cuando estaba escribiendo esto, arreglado. – Jeffrey

1

Si se trata de litterals, a continuación, puedes trabajar con los números hexadecimales. Conversión de patrones de bits a hexadecimal sus números:

10101 => 0x15 
00100 => 0x04 

Así que el siguiente código C sentaría a b el resultado que desea.

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

Si quería algo genérico que podría tener una función C (con toda la comprobación de rango eliminado) como

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

Para borrar o desarmar un poco

Utilice el operador AND (&) para limpiar un poco.

number &= ~(1 << x); 

That will clear bit x. Debe invertir la cadena de bits con el operador NOT bit a bit (~), y luego Y.

NOTA: aquí x es la posición del bit que comienza de 0 a LSB.

0

Puede alternar el enésimo bit

resultado = número^(1 < < BitIndex)

+1

Alternar no se borra. OP quiere que el bit se quede 0 si ya es 0. –

Cuestiones relacionadas