Системы счислений, Hex(доп. код) to Dec(прямой код) |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Системы счислений, Hex(доп. код) to Dec(прямой код) |
Morfey85 |
Сообщение
#1
|
Новичок Группа: Пользователи Сообщений: 19 Пол: Мужской Репутация: 0 |
Исходная информация: целое число , записанное в виде строки шестнадцатиричных цифр в дополнительном коде.
Задание: записать это число в прямом коде в виде строки десятичных цифр. |
klem4 |
Сообщение
#2
|
Perl. Just code it! Группа: Пользователи Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: 44 |
Загляни сюда : FAQ : Системы счислений
-------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
Morfey85 |
Сообщение
#3
|
Новичок Группа: Пользователи Сообщений: 19 Пол: Мужской Репутация: 0 |
Ну в системой счислений у меня проблем то как раз нет!
А вот как из дополнительного в прямой перевести? |
klem4 |
Сообщение
#4
|
Perl. Just code it! Группа: Пользователи Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: 44 |
Все просто :
Дополнительный код получается из обратного путем арифметического прибавления единицы в конец. Обратный код получается из прмого путем инверсии двоичных разрядов (1 -> 0, 0 -> 1) Сообщение отредактировано: klem4 - -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
Morfey85 |
Сообщение
#5
|
Новичок Группа: Пользователи Сообщений: 19 Пол: Мужской Репутация: 0 |
Долго пыжился но написал
Код uses crt; var znak,ch:Char; s:string; x:longint; Procedure Info; begin Writeln('Перевести целое число из шестнадцатиричной системы счислений'); Writeln('в дополнительном коде, в прямой код в виде строки десятичных'); Writeln('цифр со знаком.'); end; Function BinToInt(bin_s:string):longint; var bin,mult:longint; i:integer; begin mult:=1; bin:=0; for i:=length(bin_s) downto 1 do begin if bin_s[i]='1' then bin:=bin+mult; mult:=mult shl 1; end; BinToInt:=bin end; Function HexToBin(s:string):string; var i:byte; s1,a:string; begin s1:=''; for i:=length(s) downto 1 do begin case Upcase(s[i]) of '0': a:='0000'; '1': a:='0001'; '2': a:='0010'; '3': a:='0011'; '4': a:='0100'; '5': a:='0101'; '6': a:='0110'; '7': a:='0111'; '8': a:='1000'; '9': a:='1001'; 'A': a:='1010'; 'B': a:='1011'; 'C': a:='1100'; 'D': a:='1101'; 'E': a:='1110'; 'F': a:='1111'; else Writeln('Vvedeno nevernoe chislo!!!'); end; s1:=a+s1; end; HexToBin:=s1; end; Function DopToObr(s:string):string; var i,j:integer; sa:string; begin if s[1]='0' then znak:='+' else znak:='-'; sa:=''; for i:=length(s) downto 2 do begin sa:=s[i]+sa; end; Writeln('Bin = ',znak,sa); for j:=length(sa) downto 1 do if sa[j]='0' then sa[j]:='1' else begin sa[j]:='0'; Break; end; Writeln('Obr = ',znak,sa); DopToObr:=sa; end; Function ObrToPr(s:string):string; var i:integer; begin For i:=length(s) downto 1 do If s[i]='0' then s[i]:='1' else s[i]:='0'; Writeln('Pr = ',znak,s); ObrToPr:=s; end; begin repeat clrscr; Info; Write('Hex = ');Readln(s); s:=HexToBin(s); Writeln('Dop = ',s); s:=DopToObr(s); s:=ObrToPr(s); x:=BinToInt(s); Writeln('Dec = ',znak,x); write('Press q for exit or any key for continue...'); ch:=ReadKey until upcase(ch)='Q'; end. |
Pola |
Сообщение
#6
|
Новичок Группа: Пользователи Сообщений: 38 Пол: Женский Репутация: 0 |
Все просто : Дополнительный код получается из обратного путем арифметического прибавления единицы в конец. Обратный код получается из прмого путем инверсии двоичных разрядов (1 -> 0, 0 -> 1) немного не так Обратный код получается из прямого путем инверсии двоичных разрядов абсолютной величины(1 -> 0, 0 -> 1) У положительных чисел дополнительный код совпадает с прямым! Сообщение отредактировано: Pola - |
klem4 |
Сообщение
#7
|
Perl. Just code it! Группа: Пользователи Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: 44 |
-------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
Pola |
Сообщение
#8
|
Новичок Группа: Пользователи Сообщений: 38 Пол: Женский Репутация: 0 |
Я такое уже решила вот ссылку на другие ресурсы - в мусор... это против правил... Зохотела-бы выложила бы свой код сюда.
это ты спрашивал или вы сговорились? буду рада если найдете ошибки значи там в конце надо исправить -1 00000001 - это 1 11111110 - это инверсия 11111111 - это +1 к инверсии -127 01111111 это 127 10000000 это его инверсия 10000001 затем +1 Цитата вот ссылку на другие ресурсы - в мусор... это против правил... Зохотела-бы выложила бы свой код сюда. пусть тогда сам делает Тоесть выложить свой шедевр (с) не соизволишь ? Сообщение отредактировано: klem4 - |
Pola |
Сообщение
#9
|
Новичок Группа: Пользователи Сообщений: 38 Пол: Женский Репутация: 0 |
свой не буду уж...
его исправленный были ошибки: {error 1}{error 2}{error 3} 1) У положительных чисел дополнительный код совпадает с прямым - у него не совпадает! (исправлено) 2) 80 = -128 из-за потери разряда получался -0 (исправлено) аналогично 8000, ... 3) поскольку x:longint - 4 байта то с числами длиннее не работает (так и осталось) но возникает еще одна ошибка при выводе самого большого по абс.величине отрицательного 80000000 x<=0 и поэтому выводится "-" два раза (исправлено) Код uses crt; var znak,ch:Char; s:string; x:longint; Procedure Info; begin Writeln('Перевести целое число из шестнадцатиричной системы счислений'); Writeln('в дополнительном коде, в прямой код в виде строки десятичных'); Writeln('цифр со знаком.'); end; Function BinToInt(bin_s:string):longint; var bin,mult:longint; i:integer; begin mult:=1; bin:=0; for i:=length(bin_s) downto 1 do begin if bin_s[i]='1' then bin:=bin+mult; mult:=mult shl 1; end; BinToInt:=bin end; Function HexToBin(s:string):string; var i:byte; s1,a:string; begin s1:=''; for i:=length(s) downto 1 do begin case Upcase(s[i]) of '0': a:='0000'; '1': a:='0001'; '2': a:='0010'; '3': a:='0011'; '4': a:='0100'; '5': a:='0101'; '6': a:='0110'; '7': a:='0111'; '8': a:='1000'; '9': a:='1001'; 'A': a:='1010'; 'B': a:='1011'; 'C': a:='1100'; 'D': a:='1101'; 'E': a:='1110'; 'F': a:='1111'; else Writeln('Vvedeno nevernoe chislo!!!'); end; s1:=a+s1; end; HexToBin:=s1; end; Function DopToObr(s:string):string; var i,j:integer; sa:string; f:boolean; begin if s[1]='0' then znak:='+' else znak:='-'; sa:=''; for i:=length(s) downto 1 do {error 2} begin sa:=s[i]+sa; end; if znak='-' then {error 1} begin {error 1} Writeln('Bin = ',znak,sa); j:=length(sa); f:=true; while (j>0) and f do begin if sa[j]='0' then sa[j]:='1' else begin sa[j]:='0'; f:=false; end; dec(j); end; Writeln('Obr = ',znak,sa); end; {error 1} DopToObr:=sa; end; Function ObrToPr(s:string):string; var i:integer; begin if znak='-' then {error 1} For i:=length(s) downto 1 do If s[i]='0' then s[i]:='1' else s[i]:='0'; Writeln('Pr = ',znak,s); ObrToPr:=s; end; begin repeat clrscr; Info; Write('Hex = ');Readln(s); s:=HexToBin(s); Writeln('Dop = ',s); s:=DopToObr(s); s:=ObrToPr(s); x:=BinToInt(s); Write('Dec = '); if x<0 then writeln(x) else writeln(znak,x); {error 3} write('Press q for exit or any key for continue...'); ch:=ReadKey until upcase(ch)='Q'; end. |
Текстовая версия | 5.05.2024 21:18 |