Предмет: Информатика, автор: Nemolochko

Дано целое неотрицательное число. Получить число, инвертируя его нечетные биты. Решить в паскале

Ответы

Автор ответа: Ziorar
1

Вот такая программа позволяет инвертировать нечётные биты во введённом 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.

Приложения:

Nemolochko: а если использовать побитовые операции ( арифметические сдвиги) что для этого нужно будет сделать ?
Ziorar: Я не знаю, есть ли в Паскале операции напрямую с битами. А сдвиги битов можно организовать просто умножением на 2. Каждое такое умножение будет сдвигать все биты числа вверх (к старшему биту). Но, это сдвиг с потерей информации, т.к. содержимое старшего бита при этом теряется.
Ziorar: Если сделать серию таких сдвигов, и перед каждым контролировать состояние старшего бита, то можно считать все биты числа по порядку. Для 16-ти разрядного числа: если оно меньше чем 2^15 (32768), то значит старший бит равен нулю. Если больше или равно, то значит равен единице.
Ziorar: Хотя да, есть же обычные логические операции- И, ИЛИ, НЕ и прочее (только естественно, на английском- and, or, not). Я совсем про них забыл. С их помощью вполне можно получить доступ к битам. И вся вычислительная часть этой программы тогда сведётся просто к одной строке a := a xor 43690; В общем, что то я перемудрил :)
Nemolochko: Большое спасибо, очень помог.
Ziorar: Всегда пожалуйста. Кстати, операции сдвига оказывается тоже есть (по крайней мере в PascalABC.NET). Это команды shl и shr -сдвиг влево и вправо.
Nemolochko: Ну в финале прога у меня вышла примерно такая:
Nemolochko: var
a, n,bit: byte;
begin
write('Введите целое неотрицательное число: a= ');
readln(a);
for n:=7 downto 0 do
begin
bit:=(a shr n)and 1;
write(bit);
end;
writeln();
a := a xor 170;
for n:=7 downto 0 do
begin
bit:=(a shr n)and 1;
write(bit);
end;
writeln();
writeln('После инверсии нечётных битов: a= ', a);
end.
Ziorar: Классно получилось, и вывод битов сделал лучше, чем у меня было
Похожие вопросы
Предмет: Английский язык, автор: sasha1318