Замена битового диапазона
-
03-07-2019 - |
Вопрос
На что-то любой второкурсник по CS должен быть в состоянии ответить, но я, кажется, не могу уложить это в голове...
У меня есть набор бит, и мне нужно заменить некоторые биты другим набором.В упрощенном примере:
10101010 -оригинальный набор бит
00001111 - маска, показывающая позиции замены
00001100 -новые значения битов
10101100 — результирующий набор битов
Другой пример:
10101010 -оригинальный набор бит
00110011 -маска
11111111 -новые значения битов
10111011 — результирующий набор битов
Это тривиально сделать, перебирая биты.
Можно ли это сделать, используя логическую логику (И, ИЛИ и т. д.)?
Решение
result = (original & ~mask) | (newbits & mask)
Часть "& ~ Mask" обязательно очистите эти биты до 0 до | часть.
Часть «& маска» гарантирует, что в новых битах используются только правильные биты.
Другие советы
(НОВЫЙ и МАСКА) ИЛИ (СТАРЫЙ и НЕ МАСКА)
Замаскируйте биты, которые необходимо заменить, из оригинала (путем И с НЕ маски), затем вставьте новые биты (через ИЛИ).
10101010 -оригинальный набор бит
00001111 - маска, показывающая позиции замены
00001100 -новые значения битов
11110000 - отрицательная маска
10100000 — исходный битовый набор замаскирован
10101100 - вставлены новые биты
В коде C(++) это будет:
out = (in & ~ mask) | новички;
Если новые биты содержат биты, отличные от тех, которые они должны заменить, И их также с маской.