Замена битового диапазона - PullRequest
6 голосов
/ 30 апреля 2009

Что-то, что любой второкурсник в CS должен быть в состоянии ответить, но я не могу обернуться вокруг этого ...

У меня есть набор битов, и мне нужно заменить некоторые биты другим набором. В упрощенном примере:

10101010 - установленный оригинальный бит

00001111 - маска с указанием сменных позиций

00001100 - новые битовые значения

10101100 - установленный результирующий бит

Другой пример:

10101010 - установленный оригинальный бит

00110011-маска

11111111 - новые битовые значения

10111011 - установленный результирующий бит

Это просто сделать, перебирая биты.

Возможно ли сделать это с помощью логической логики (И, ИЛИ и т. Д.)?

Ответы [ 3 ]

10 голосов
/ 30 апреля 2009
result = (original & ~mask) | (newbits & mask)

В части "& ~ mask" убедитесь, что эти биты очищены до 0 перед | часть.

Часть "& mask" обеспечивает использование только правильных битов в новых битах.

1 голос
/ 30 апреля 2009

(НОВАЯ И МАСКА) ИЛИ (СТАРЫЙ И НЕ МАСКА)

0 голосов
/ 30 апреля 2009

Замаскируйте биты, которые должны быть заменены, из оригинала (с помощью AND и NOT для маски), затем вставьте новые биты (через OR).

10101010 - установленный оригинальный бит

00001111 - маска с указанием сменных позиций

00001100 - новые битовые значения

11110000 -отрицательная маска

10100000 - оригинальный битовый набор маскируется

10101100 - новые биты возвращаются в


В коде C (++) это будет:

out = (в & ~ mask) | newbits;

Если новички содержат биты вне того, что они должны заменить, И их также с маской.

...