2011-05-19 55 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