8

バイトの最下位ビットを提供されたビットに置き換える最適な方法は何ですか?

最後のビットをチェックして比較する方法は知っていますが(たとえば、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'

明らかに、演算子は一連の操作にすることができますが、私は最適な(最速の)方法を探しています。

4

2 に答える 2

19

n & ~1の最下位ビットnをゼロに置き換えます。n | 1、 1と。

bLSBを、 0または1のいずれかに置き換えるにはb、を使用できます(n & ~1) | b

k-番目のビットをbk=0LSBを表す)に置き換えるには、次のようにし(n & ~(1 << k)) | (b << k)ます。

于 2011-05-19T13:32:22.830 に答える
0

また、ビッグエンディアンまたはリトルエンディアンのアーキテクチャを使用しているかどうかを確認することもできます。ビッグエンディアンマシンでは、最下位バイトが最上位アドレスにあります。

Pythonでは、エンディアンネスを次の方法で確認できます。

sys.byteorder

Cでは、エンディアンを自分でチェックする必要があります。ユニオンを使用したハッキン​​グは簡単です。

于 2011-05-19T13:38:18.713 に答える