2010-04-09 11 views
18

Tengo 1 bit en un byte (siempre en la posición más baja) que me gustaría invertir. es decir, considerando 00000001 Me gustaría llegar 00000000 y 00000000 con me gustaría 00000001.Invertir 1 bit en C#

Lo resuelto de esta manera:

bit > 0 ? 0 : 1; 

tengo curiosidad para ver qué otra manera se podría hacer.

Respuesta

39

¿Qué tal:

bit ^= 1; 

Esto simplemente XOR del primer bit con 1, que alterna la misma.

Si desea voltear # N bits, a contar desde 0 a la derecha hacia la 7 a la izquierda (de un byte), puede utilizar esta expresión:

bit ^= (1 << N); 

esto no va a molestar a cualquier otra los bits, pero si el valor es solamente siempre van a ser 0 o 1 en valor decimal (es decir, todos los demás bits son 0.), entonces la siguiente se pueden utilizar, así:

bit = 1 - bit; 

una vez más, si sólo hay va a estar un bit configurado, puede usar el mismo valor para 1 que en el primero para voltear el bit #N:

bit = (1 << N) - bit; 

Por supuesto, en ese momento no se está manipulando el bit en el mismo sentido.

La expresión que tiene también está bien, pero de nuevo manipulará todo el valor.

Además, si se hubiera expresado un solo bit como un valor bool, usted puede hacer esto:

bit = !bit; 

que conmuta el valor.


Más de una broma: Por supuesto, la forma "enterprisey" sería utilizar una tabla de búsqueda:

byte[] bitTranslations = new byte[256]; 
bitTranslations[0] = 1; 
bitTranslations[1] = 0; 

bit = bitTranslations[bit]; 
+0

Esto tiene la ventaja de no requerir el primer bit es necesario seleccionar primero, también. –

+0

¡Primero quise usar! pero luego descubrió que es solo para bools. Cosas divertidas, trabajando en este nivel. –

+0

Apoyaría el argumento de 'expresarlo como un bool': dependiendo de lo que esté haciendo, puede hacer que el código sea un poco más fácil de leer para el siguiente tipo que mantenga. – Paddy

4

Su solución no es correcta, porque si el bit 2 == (10) entonces su asignación dará bit == 0 (00).

Esto es lo que quiere:

bit ^= 1; 
+0

Tienes razón, pero ya he cambiado el bit al orden más bajo, así que esto no es un problema para mí –

+0

Si todo lo que estás tratando de hacer es probar/manipular ese bit, puedes deshacerte del turno operación y simplemente xor it in-place con una constante diferente (por ejemplo, si fue el séptimo bit más significativo, usted hace algo así como bit^= 0x40;) – par