Replace least significant bit with bitwise operations

Emilio picture Emilio · May 19, 2011 · Viewed 9.4k times · Source

What is a optimal way to replace the Least Significant Bit of a byte, with a provided bit?

I know how to do checking and comparing last bit (using for example posix ffs() function), but I want to know if there are solutions with better performance, without checking if replacing bit is 0 or 1.

The example is written in python as pseudocode, but I will implement the working algorithm in 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'

Obviously operator can be a set of operations, but I'm looking for the optimal (fastest) method.

Answer

NPE picture NPE · May 19, 2011

n & ~1 replaces the least significant bit of n with zero; n | 1, with one.

To replace the LSB with b, where b can be either 0 or 1, you can use (n & ~1) | b.

To replace the k-th bit with b (where k=0 stands for the LSB): (n & ~(1 << k)) | (b << k).