Как скопировать последние X бит? - PullRequest
2 голосов
/ 11 июля 2010

Допустим, у меня есть два целых числа со следующими двоичными представлениями:

01101010
00110101

А теперь я хочу скопировать последние 3 бита из первого целого числа во второе так, чтобы оно стало

00110010

Какой самый простой способ сделать это?

(На самом деле, моя цель - сдвинуть все биты X + 1 к правильному, по существу удалив X-й бит и оставить биты X-1 такими же - в этом случае X равен 4)


«Почему?»:

У вас есть куча флагов,

1 = 'permission x'
2 = 'permission y'
4 = 'permission z'
8 = 'permission w'

Вы решаете, что это «разрешение y» больше не требуется в вашей программе, и, таким образом, сдвигаете z и w на верхнюю позицию (делая их 2 и 4 соответственно). Однако теперь вам нужно обновить все значения в вашей базе данных .... (какую формулу вы используете?)

Ответы [ 2 ]

8 голосов
/ 11 июля 2010

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

Я использую 2.5.2, поэтому я использовал это:

>>> a = int('01101010', 2)
>>> b = int('00110101', 2)
>>> mask = 07  # Mask out the last 3 bits.
>>> (b & ~mask) | (a & mask)
50
>>> int('00110010', 2)
50

подробности:

(b & ~mask)  <- This keeps the first n-3 bits. (By negating the 3bit mask).
(a & mask)   <- This keeps the last 3 bits.
If you '|' (bitwise OR) them together, you get your desired result.

Я не понял вашу цель в последнем предложении, поэтому я не знаю, как решить эту проблему:)

2 голосов
/ 11 июля 2010

На основании ответа Стивена (обоснуйте его), решение:

def f(pos, val):
    """
    @pos: the position of the bit to remove
    @val: the value to remove it from
    """
    mask = (1<<(pos-1))-1
    return ((val>>1) & ~mask) | (val & mask)

print f(4, int('01101010', 2)) == int('00110010', 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...