用位运算替换最低有效位

10

如何以最优的方式将一个字节的最低有效位替换为提供的位?

我知道如何检查和比较最后一位(例如使用posix ffs()函数),但我想知道是否有更好性能的解决方案,而无需检查替换位是0还是1。

这个例子是用Python伪代码编写的,但我将在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'

显然,运算符可以是一组操作,但我正在寻找最佳(最快)方法。

2个回答

22

n & ~1n 的最低位替换为零;n | 1 则将其替换为一。

要将 LSB 替换为 b,其中 b 可以是 0 或 1,则可以使用 (n & ~1) | b

要将第 k 位替换为 b(其中 k=0 表示 LSB):(n & ~(1 << k)) | (b << k)


我总是需要在替换位之前检查它是否为0或1。有一个“通用”的运算符吗? - Emilio
如果可以的话,再请帮我一个忙。如果我想在特定的字节位置设置给定位,我可以使用 x = x | pos 来设置为 1 或者使用 x = x & ~pos 来设置为 0。我能否将这两个函数合并到单个逻辑语句中,以便同时处理 1 和 0?谢谢。 - Emilio
@Emilio:为此,您只需将b左移。请参见更新的答案。 - NPE

0

你可能还想检查一下你的计算机是大端序还是小端序。在大端序的机器上,最不重要的字节位于最高地址。

在Python中,你可以通过以下方式检查字节序:

sys.byteorder

在C语言中,你需要自己检查字节序,使用联合体进行黑客式操作很容易。

2
我不明白字节序与这个问题有什么关系。@aix 给出的解决方案无论字节序如何都可以工作。 - Simon Nickerson
@Simon,是的,你说得对。1 是一个整数,并且它也遵循相同的字节序。 - Xolve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接