2011-05-19 32 views
7

¿Cuál es una forma óptima de reemplazar el bit menos significativo de un byte, con un bit provisto?Reemplazar bit menos significativo con operaciones bit a bit

sé cómo hacer la comprobación y comparación último bit (utilizando por ejemplo POSIX (FFS) de función), pero quiero saber si hay soluciones con mejor rendimiento, sin comprobar si la sustitución de bit es 0 ó 1.

el ejemplo está escrito en Python como pseudocódigo, pero voy a poner en práctica el algoritmo de trabajo en C:

>>> bin(0b1)    # bit is '0b1' 
>>> bin(128)    # byte is '0b10000000' 
>>> bin(129)    # byte is '0b10000001' 

>>> bin(128 OPERATOR 0b1)  # Replace LSB with 1 
'0b10000001' 
>>> bin(128 OPERATOR 0b0)  # Keep LSB at 0 
'0b10000000' 

>>> bin(129 OPERATOR 0b1)  # Keep LSB at 1 
'0b10000001' 
>>> bin(129 OPERATOR 0b0)  # Replace LSB with 0 
'0b10000000' 

Obviamente operador puede ser un conjunto de operaciones, pero estoy buscando el método óptimo (el más rápido).

Respuesta

15

n & ~1 reemplaza el bit menos significativo de n con cero; n | 1, con uno. Para reemplazar el LSB con b, donde b puede ser 0 o 1, puede usar (n & ~1) | b.

Para reemplazar el bit k -th con b (donde k=0 representa el LSB): (n & ~(1 << k)) | (b << k).

+0

Siempre tengo que verificar si mi bit de reemplazo es 0 o 1. ¿Hay un operador "universal"? – Emilio

+0

@Emilion: '(n & ~ 1) | b' – NPE

+0

lòl, perfecto. Muchas gracias. – Emilio

0

También es posible que desee comprobar si está en arquitectura big endian o little endian. En las máquinas de Big Endian, el byte menos significativo se encuentra en la dirección más alta.

En Python se puede comprobar endian-dad por

sys.byteorder

En C es necesario comprobar endian-dad por su cuenta, utilizando uniones piratear es fácil de hacer.

+2

No veo qué endianness tiene que ver con esta pregunta. La solución @aix dio funcionará independientemente de endianness. –

+0

@Simon sí, tienes razón. 1 es un int y también seguirá el mismo endianness. – Xolve

Cuestiones relacionadas