Илья, спасибо.

Уже решил задачку. Хороший сон положительно сказывается на сообразительности
НЕ все варианты проверил, но по идее должно работать:

(* псевдокод *)
CONST
m1 = 2#10101010 (* маска групп*)
m2 = ~m1 (* инвресная маска *)
VAR
x: BYTE;
y: BYTE;
BEGIN
y := ASH(x); (*сдвигаем на 1 разряд влево*)
y := ~(y AND m1) AND (y OR m1); (* y := y XOR m1 *)
y := y OR m2;
END.

Мне надо на ассемблере сделать, для довольно экзотического ПЛК, в котором каждая команда от 2 до 5 байт занимает, при работе с битовыми полями. А памяти, как всегда, мало.Для 32-битных слов этот код занимает около 30 байт. А если делать красиво по-битово, то хапает сразу около 300 байт.