Вопрос

На что-то любой второкурсник по 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) | новички;

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top