Как установить подмножество бит в X эквивалентно битам в Y - PullRequest
1 голос
/ 10 февраля 2012

Я зашел в тупик в части, где мне нужно сделать следующее: Учитывая число X (скажем 10101010) и число Y (скажем 1110) и две переменные положения i, j (скажем, i = 1, j = 4), мне нужно установить все биты в X от i j, чтобы соответствовать битам в Y. Для приведенного выше примера ответ должен быть 101 | 1110 | 0.

Решение, которое я имел в виду, было:

1. Right shift X >> i
3. Run loop from 0 to j-1
2. if(!(X (lsb) ^ Y(lsb)), then continue, else X(lsb) = ~X(lsb)

Дело в том, что я не уверен, как играть с отдельными битами.

Ответы [ 2 ]

4 голосов
/ 10 февраля 2012
  1. Создать маску, в которой единственные нули находятся в битовых позициях i до j, что составляет ~ (2 j + 1 - 2 i )

  2. Результат = (mask & X) | (Y << i)

Пример на Python:

def replace_bits(X, Y, i, j):
    mask = ~(2**(j+1) - 2**i)
    return (mask & X) | (Y << i)

>>> replace_bits(int('10101010', 2), int('1110', 2), 1, 4)
188
>>> bin(replace_bits(int('10101010', 2), int('1110', 2), 1, 4))
'0b10111100'
4 голосов
/ 10 февраля 2012

2 ^ j - 1 дает число, где бит от первого до j-го равен единице.

То есть Z = (2 ^ j - 1) - (2 ^ i - 1) имеет все биты от i до j, равные 1.

Теперь сдвиньте влево Y на i бит.

X - (X & Z) + Y - окончательный ответ.

...