Форум «Всё о Паскале» _ Задачи _ дополнительный код в виде строки 16-х цифр
Автор: FCT-Miasnik_YK 5.10.2006 0:39
Задача!!! Исходная информация: целое число, записанное в виде строки шестнадцатеричных цифр, которой может предшестововать знак. Задание: записать это число в дополнительном коде в виде строки шестнадцатеричных цифр. Примечание: можно считать, что первая цифра исходного числа не превосходит 7.
пожалуйста, помогите! Я решил остальные задачи по Лабе, но с этой очень большие проблемы! Я окончательно запутался! Хелп помогите мне выкрутится!!! Буду всем очень благодарен, надеюсь не кто меня не посчитает халявщиком и тем кто не хочет учиться !:!help:
Автор: volvo 5.10.2006 14:30
var n: string; L: word;
begin n := '75F'; writeln(fromdec( not(word(todec(n, 16))) + $1, 16 )); end.
Этот код будет работать со строками длиной до 4-х символов...
Автор: Atos 5.10.2006 15:16
Один из способов:
Цитата
Переписываем исходную последовательность битов числа справа налево до первой единицы, включая ее. Остальные биты заменяем их дополнениями (инвертируем).
Читаем строку справа налева. Если очередной символ '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 }
Автор: volvo 5.10.2006 17:30
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 6.10.2006 2:59
всем спасибо, волво прости за тему на другом форуме...