2011-05-19 127 views
7

什么是用提供位替换字节最低有效位的最佳方法?用位运算替换最低有效位

我知道该怎么做检查和最后一位比较(例如使用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' 

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

回答

15

n & ~1用零代替n的最低位; n | 1,一个。

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

要用b(其中k=0代表LSB)代替k第012位:(n & ~(1 << k)) | (b << k)

+0

如果我的替换位是0或1,我总是要检查。有一个'通用'操作符? – Emilio 2011-05-19 13:34:43

+0

@Emilion:'(n&〜1)| b' – NPE 2011-05-19 13:36:23

+0

lòl,完美。非常感谢。 – Emilio 2011-05-19 13:40:34

0

您也可能想检查您是否在大端或小端架构。在大端机器中,最不重要的字节位于最高地址处。

在Python中,你可以通过

sys.byteorder

检查字节序在C语言中,你需要检查字节序你自己,黑客利用工会是很容易做到。

+2

我不明白这个问题有什么字节顺序。 @aix给出的解决方案不管字节顺序如何都可以工作。 – 2011-05-19 15:31:44

+0

@Simon是的,你是对的。 1是一个整数,它也将遵循相同的字节顺序。 – Xolve 2011-05-19 16:19:16