Помощь - Поиск - Пользователи - Календарь
Полная версия: дополнительный код в виде строки 16-х цифр
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
FCT-Miasnik_YK
Задача!!!
Исходная информация: целое число, записанное в виде строки шестнадцатеричных цифр, которой может предшестововать знак.
Задание: записать это число в дополнительном коде в виде строки шестнадцатеричных цифр.
Примечание: можно считать, что первая цифра исходного числа не превосходит 7.


пожалуйста, помогите! Я решил остальные задачи по Лабе, но с этой очень большие проблемы! Я окончательно запутался! Хелп помогите мне выкрутится!!! Буду всем очень благодарен, надеюсь не кто меня не посчитает халявщиком и тем кто не хочет учиться !:!help:
volvo
var
n: string;
L: word;

begin
n := '75F';
writeln(fromdec( not(word(todec(n, 16))) + $1, 16 ));
end.


Реализация FromDec/ToDec - здесь: FAQ: Общие вопросы по математике

Этот код будет работать со строками длиной до 4-х символов...
Atos
Один из способов:
Цитата
Переписываем исходную последовательность битов числа справа налево до первой единицы, включая ее. Остальные биты заменяем их дополнениями (инвертируем).


Читаем строку справа налева. Если очередной символ '0', то ничего с ним не делаем. Иначе применяем к этому символу функцию FirstOne {вообще-то удобнее былобы её процедурой сделать, ну да ладно...} и затем ко всем ещё непрочитанным символам строки применяем функцию InvertHex.

Это всё для положительного числа. Для отрицательного легче: просто убрать минус, а к первому слева символу применить операцию Plus8 (этим самым заменяя старший бит с нуля на единицу)



Код

function InvertHex(ch:char):char;
begin
case ch of
'0': InvertHex:='F';
'1': InvertHex:='E';
'2': InvertHex:='D';
'3': InvertHex:='C';
'4': InvertHex:='B';
'5': InvertHex:='A';
'6': InvertHex:='9';
'7': InvertHex:='8';
'8': InvertHex:='7';
'9': InvertHex:='6';
'A': InvertHex:='5';
'B': InvertHex:='4';
'C': InvertHex:='3';
'D': InvertHex:='2';
'E': InvertHex:='1';
'F': InvertHex:='0';
end;
end;

function FirstOne(ch:char):char;
begin
case ch of
'1': FirstOne:='F';
'2': FirstOne:='E';
'3': FirstOne:='D';
'4': FirstOne:='C';
'5': FirstOne:='B';
'6': FirstOne:='A';
'7': FirstOne:='9';
'8': FirstOne:='8';
'9': FirstOne:='7';
'A': FirstOne:='6';
'B': FirstOne:='5';
'C': FirstOne:='4';
'D': FirstOne:='3';
'E': FirstOne:='2';
'F': FirstOne:='1';
end;
end;

function Plus8(ch:char):char;
begin
case ch of
'0': Plus8:='8';
'1': Plus8:='9';
'2': Plus8:='A';
'3': Plus8:='B';
'4': Plus8:='C';
'5': Plus8:='D';
'6': Plus8:='E';
'7': Plus8:='F';
end;
end;





{когда писал, ещё не видел ответа volvo smile.gif}
volvo
Atos, в принципе, если работать со строками - то решение будет еще проще, чем ты думал:

const
digit: string[16]='0123456789ABCDEF';
var
n, s: string;
i, p, shift: integer;

begin
n := '1275F0'; s := '';
shift := 1;
for i := length(n) downto 1 do begin
p := succ(16 - pos(n[i], digit)) + shift;
if p > 16 then begin
dec(p, 16); shift := 1
end
else shift := 0;

s := digit[p] + s;
end;
writeln(s);
end.
FCT-Miasnik_YK
всем спасибо, волво прости за тему на другом форуме...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.