Вот такая программа позволяет инвертировать нечётные биты во введённом 16-ти разрядном числе (тип word).
Если что, счёт битов я брал начиная с нуля. Поэтому, младший бит (нулевой) считается чётным. Если вдруг у вас там принято считать биты начиная с единицы, то младший будет нечётным, и тогда в строке где b := 2; надо поставить единицу вместо двух.
Также, я сделал отображение всех 16 разрядов введённого числа, и числа которое получилось после инверсии битов (то есть, число выводится в двоичном виде, начиная со старших разрядов). Это сделано для удобства проверки работы программы.
После проверки лучше удалить эти две строки (они выделены жирным шрифтом), ведь в задании не сказано выводить числа в двоичном виде.
var
a, b, n: word;
begin
write('Введите целое неотрицательное число: a= ');
readln(a);
b:=32768;for n:=15 downto 0 do begin write((a mod(b*2))div b);b:=b div 2;end;writeln();
b := 2;
for n := 0 to 7 do
begin
if (a mod (b * 2)) div b = 0
then a := a + b
else a := a - b;
b := b * 4;
end;
b:=32768;for n:=15 downto 0 do begin write((a mod(b*2))div b);b:=b div 2;end;writeln();
writeln('После инверсии нечётных битов: a= ', a);
end.
Объяснение:
89/2=44 (остаток 1)
44/2=22 (0)
22/2=11 (0)
11/2=5 (1)
5/2=2 (1)
2/2=1(0)
1/2=0 (1)
89₁₀=1011001₂
73/2=36 (1)
36/2=18 (0)
18/2=9 (0)
9/2=4 (1)
4/2=2 (0)
2/2=1 (0)
1/2=0 (1)
73₁₀=1001001₂
1 0 1 1 0 0 1
+ 1 0 0 1 0 0 1
1 0 1 0 0 0 1 0
1 0 1 1 0 0 1
- 1 0 0 1 0 0 1
1 0 0 0 0
1 0 1 1 0 0 1
× 1 0 0 1 0 0 1
1 0 1 1 0 0 1
+ 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0
+ 1 0 1 1 0 0 1
+ 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0
+ 1 0 1 1 0 0 1
1 1 0 0 1 0 1 1 0 0 0 0 1
3268₁₀=110011000100₂ (как переводить числа в двоичную систему я расписал выше).
43₁₀=101011₂
110011000100 |_101011_
- 101011 | 1001100
1000000
- 10 10 1 1
1 0 1 0 1 1
- 1 0 1 0 1 1
0
вот держи)
не мучайся)
))