Функция перевода из шестнадцатеричной двоичную систему счисления и наоборот - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Помогите, пожалуйста написать несколько функций. Нужны функции перевода чисел из 16 сист.счисл в 2 сист.счисл, и наоборот. Главное чтобы функции работали с отрицательными числами. Т.е. если я ввожу число F, то вывести мне нужно 1111. Если дано -F то нужно представить в доп. коде, т.е. 1111 0001

Решение задачи: «Функция перевода из шестнадцатеричной двоичную систему счисления и наоборот»

textual
Листинг программы
  1. var b, h: string;
  2.  
  3. //проверка корректности двоичного числа
  4. function testb(s: string): boolean;
  5. var i: integer;
  6. begin
  7.   if s[1] = '+' then delete(s, 1, 1); //ведущий "+" удалить
  8.   if length(s) > 8 //если число > 8 символов
  9.     then testb := false //то неверное
  10.     else begin //иначе
  11.       testb := true; //пока верное
  12.       if s[1] = '-' then delete(s, 1, 1); //ведущий "-" удалить
  13.       for i := 1 to length(s) do if not(s[i] in ['0', '1']) //проверяем цифры
  14.         then begin //если цифра не "0" или "1", то
  15.           testb := false; //число неверное
  16.           break //дальше проверять смысл умер, досрочно выходим из цикла
  17.         end
  18.     end
  19. end;
  20.  
  21. //перевод из двоичного в шестнадцатеричное
  22. function bintohex(s: string): string;
  23. //массив шестнадцатеричных цифр, индекс массива соответствует значению цифры
  24. const d: array [0..15] of char = ('0', '1', '2', '3', '4', '5', '6', '7',
  25.                                   '8', '9', 'A', 'B', 'C', 'D', 'E', 'F');
  26. var a, i: integer;
  27.     z: boolean;
  28. begin
  29.   if s[1] = '+' then delete(s, 1, 1); //ведущий "+" удаляем
  30.   if s[1] = '-' //если ведущий "-"
  31.     then begin //то
  32.       z := true; //число отрицательное
  33.       delete(s, 1, 1) //"-" удаляем
  34.     end
  35.     else z := false; //иначе число положительное
  36.   a := 0; //буфер для числа
  37.   for i := 1 to length(s) do //преобразуем строку в число
  38.     begin
  39.       a := a shl 1; //сдвигаем буфер влево, освобождаем место для очередного младшего разряда
  40.       if s[i] = '1' then a := a or 1 //пишем разряд в буфер
  41.     end;
  42.   if z then a := -a; //если число отрицательное - пусть и будет отрицательное
  43.   //переводим:
  44.   //вырезаем соответствующие разряды из буфера числа
  45.   //и используем как индекс для массива шестнадцатеричных цифр
  46.   bintohex := d[(a shr 4) and 15] + d[a and 15]
  47. end;
  48.  
  49. //нормализация шестнадцатеричного числа
  50. procedure normh(var s: string);
  51. var i: integer;
  52. begin
  53.   if s[1] = '+' then delete(s, 1, 1); //убираем ведущий "+"
  54.   for i := 1 to length(s) do //заменяем символы "a".."f" на "A".."F"
  55.     if s[i] in ['a'..'f'] then s[i] := char(byte(s[i]) - byte('a') + byte('A'));
  56. end;
  57.  
  58. //проверка корректности шестнадцатеричного числа
  59. function testh(s: string): boolean;
  60. var i: integer;
  61. begin
  62.   if s[1] in ['+', '-'] then delete(s, 1, 1); //ведущие "+" или "-" удаляем
  63.   if length(s) > 2 //если длина числа > 2 цифр
  64.     then testh := false //то число неверное
  65.     else begin //иначе
  66.       testh := true; //пока число верное
  67.       //если хоть одна цифра не шестнадцатеричная, число неверное
  68.       for i := 1 to length(s) do
  69.         if not(s[1] in ['0'..'9', 'A'..'F']) then testh := false
  70.     end;
  71. end;
  72.  
  73. //перевод одной шестнадцатеричной цифры
  74. function hex1(s: char): integer;
  75. begin
  76.   if s in ['0'..'9']
  77.     then hex1 := byte(s) - byte('0')
  78.     else hex1 := byte(s) - byte('A') + 10
  79. end;
  80.  
  81. //перевод из шестнадцатеричного в двоичное
  82. function hextobin(s: string): string;
  83. var z: boolean;
  84.     a, m: integer;
  85.     b: string;
  86. begin
  87.   if s[1] = '-' //запоминаем знак числа и убираем ведущий "-"
  88.     then begin
  89.       z := true;
  90.       delete(s, 1, 1)
  91.     end
  92.     else z := false;
  93.   if length(s) = 0 //если длина числа 0
  94.     then s := '00' //то число 00
  95.     else if length(s) = 1 //иначе если длина числа 1
  96.       then s := '0' + s; //то число 0s
  97.   a := hex1(s[1]) * 16 + hex1(s[2]); //переводим строку в число
  98.   if z then a := -a; //если число отрицательное
  99.   b := '';
  100.   m := 128; //маска для перевода в двоичную форму: двоичное 10000000 (1 в 8 разряде)
  101.   while m <> 0 do
  102.     begin
  103.       //перевод: выделяем двоичный разряд маской, и пишем соответствующий символ в строку
  104.       if (a and m) <> 0 then b := b + '1' else b := b + '0';
  105.       //сдвигаем маску на следующий разряд
  106.       m := m shr 1
  107.     end;
  108.   hextobin := b //строка готова
  109. end;
  110.  
  111. begin
  112.   repeat //балуемся 2 -> 16
  113.     write('Binary number = ');
  114.     readln(b); //вводим строку
  115.     //если число некорректное, повторяем ввод
  116.     if not(testb(b)) then writeln('Invalid number, reenter.')
  117.   until testb(b);
  118.   h := bintohex(b); //переводим 2 -> 16
  119.   writeln('In hexadecimal = ', h); //печатаем
  120.   repeat //балуемся 16 -> 2
  121.     write('Hexadecimal number = ');
  122.     readln(h); //вводим строку
  123.     normh(h); //нормализуем
  124.     //если число некорректное, повторяем ввод
  125.     if not(testh(h)) then writeln('Invalid number, reenter.')
  126.   until testh(h);
  127.   b := hextobin(h); //переводим 16 -> 2
  128.   writeln('in binary = ', b); //печатаем
  129.   readln
  130. end.

Объяснение кода листинга программы

  1. Функция testb проверяет корректность двоичного числа. Она удаляет ведущий + и -, проверяет длину числа (не более 8 символов), и проверяет каждую цифру на соответствие 0 или 1. Если число некорректное, функция возвращает false, иначе true.
  2. Функция bintohex преобразует двоичное число в шестнадцатеричное. Она удаляет ведущий + и -, определяет знак числа (положительное или отрицательное), затем преобразует строку в число, используя сдвиги и операции И. Шестнадцатеричное число формируется путем вырезания соответствующих разрядов из буфера числа.
  3. Функция normh нормализует шестнадцатеричное число, заменяя символы a..f на A..F.
  4. Функция testh проверяет корректность шестнадцатеричного числа. Она удаляет ведущие + и -, проверяет длину числа (не более 2 цифр), и проверяет каждую цифру на соответствие 0..9 или A..F. Если число некорректное, функция возвращает false, иначе true.
  5. Функция hextobin преобразует шестнадцатеричное число в двоичное. Она удаляет ведущий - и определяет знак числа. Затем она преобразует шестнадцатеричную строку в число, используя функцию hex1, и формирует двоичное число, начиная с младшего разряда.
  6. Основная программа запрашивает ввод двоичного числа, преобразует его в шестнадцатеричное, выводит результат, затем запрашивает ввод шестнадцатеричного числа, нормализует его, преобразует обратно в двоичное число и выводит результат.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.778 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы