Заменить младший бит битовыми операциями - PullRequest
7 голосов
/ 19 мая 2011

Каков оптимальный способ замены младшего значащего бита на предоставленный бит?

Я знаю, как выполнять проверку и сравнение последнего бита (используя, например, функцию 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 ]

15 голосов
/ 19 мая 2011

n & ~1 заменяет младший значащий бит n на ноль;n | 1, с одним.

Для замены LSB на b, где b может быть 0 или 1, вы можете использовать (n & ~1) | b.

Для замены k -й бит с b (где k=0 обозначает LSB): (n & ~(1 << k)) | (b << k).

0 голосов
/ 19 мая 2011

Вы также можете проверить, используете ли вы архитектуру с прямым или прямым порядком байтов. В машинах с прямым порядком байтов младший байт находится по старшему адресу.

В Python вы можете проверить порядковый номер

sys.byteorder

В Си вам нужно самостоятельно проверить порядок байтов, взломать с помощью союзов легко.

...