Функция перевода из шестнадцатеричной двоичную систему счисления и наоборот - Free Pascal
Формулировка задачи:
Здравствуйте! Помогите, пожалуйста написать несколько функций. Нужны функции перевода чисел из 16 сист.счисл в 2 сист.счисл, и наоборот. Главное чтобы функции работали с отрицательными числами. Т.е. если я ввожу число F, то вывести мне нужно 1111. Если дано -F то нужно представить в доп. коде, т.е. 1111 0001
Решение задачи: «Функция перевода из шестнадцатеричной двоичную систему счисления и наоборот»
textual
Листинг программы
var b, h: string; //проверка корректности двоичного числа function testb(s: string): boolean; var i: integer; begin if s[1] = '+' then delete(s, 1, 1); //ведущий "+" удалить if length(s) > 8 //если число > 8 символов then testb := false //то неверное else begin //иначе testb := true; //пока верное if s[1] = '-' then delete(s, 1, 1); //ведущий "-" удалить for i := 1 to length(s) do if not(s[i] in ['0', '1']) //проверяем цифры then begin //если цифра не "0" или "1", то testb := false; //число неверное break //дальше проверять смысл умер, досрочно выходим из цикла end end end; //перевод из двоичного в шестнадцатеричное function bintohex(s: string): string; //массив шестнадцатеричных цифр, индекс массива соответствует значению цифры const d: array [0..15] of char = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'); var a, i: integer; z: boolean; begin if s[1] = '+' then delete(s, 1, 1); //ведущий "+" удаляем if s[1] = '-' //если ведущий "-" then begin //то z := true; //число отрицательное delete(s, 1, 1) //"-" удаляем end else z := false; //иначе число положительное a := 0; //буфер для числа for i := 1 to length(s) do //преобразуем строку в число begin a := a shl 1; //сдвигаем буфер влево, освобождаем место для очередного младшего разряда if s[i] = '1' then a := a or 1 //пишем разряд в буфер end; if z then a := -a; //если число отрицательное - пусть и будет отрицательное //переводим: //вырезаем соответствующие разряды из буфера числа //и используем как индекс для массива шестнадцатеричных цифр bintohex := d[(a shr 4) and 15] + d[a and 15] end; //нормализация шестнадцатеричного числа procedure normh(var s: string); var i: integer; begin if s[1] = '+' then delete(s, 1, 1); //убираем ведущий "+" for i := 1 to length(s) do //заменяем символы "a".."f" на "A".."F" if s[i] in ['a'..'f'] then s[i] := char(byte(s[i]) - byte('a') + byte('A')); end; //проверка корректности шестнадцатеричного числа function testh(s: string): boolean; var i: integer; begin if s[1] in ['+', '-'] then delete(s, 1, 1); //ведущие "+" или "-" удаляем if length(s) > 2 //если длина числа > 2 цифр then testh := false //то число неверное else begin //иначе testh := true; //пока число верное //если хоть одна цифра не шестнадцатеричная, число неверное for i := 1 to length(s) do if not(s[1] in ['0'..'9', 'A'..'F']) then testh := false end; end; //перевод одной шестнадцатеричной цифры function hex1(s: char): integer; begin if s in ['0'..'9'] then hex1 := byte(s) - byte('0') else hex1 := byte(s) - byte('A') + 10 end; //перевод из шестнадцатеричного в двоичное function hextobin(s: string): string; var z: boolean; a, m: integer; b: string; begin if s[1] = '-' //запоминаем знак числа и убираем ведущий "-" then begin z := true; delete(s, 1, 1) end else z := false; if length(s) = 0 //если длина числа 0 then s := '00' //то число 00 else if length(s) = 1 //иначе если длина числа 1 then s := '0' + s; //то число 0s a := hex1(s[1]) * 16 + hex1(s[2]); //переводим строку в число if z then a := -a; //если число отрицательное b := ''; m := 128; //маска для перевода в двоичную форму: двоичное 10000000 (1 в 8 разряде) while m <> 0 do begin //перевод: выделяем двоичный разряд маской, и пишем соответствующий символ в строку if (a and m) <> 0 then b := b + '1' else b := b + '0'; //сдвигаем маску на следующий разряд m := m shr 1 end; hextobin := b //строка готова end; begin repeat //балуемся 2 -> 16 write('Binary number = '); readln(b); //вводим строку //если число некорректное, повторяем ввод if not(testb(b)) then writeln('Invalid number, reenter.') until testb(b); h := bintohex(b); //переводим 2 -> 16 writeln('In hexadecimal = ', h); //печатаем repeat //балуемся 16 -> 2 write('Hexadecimal number = '); readln(h); //вводим строку normh(h); //нормализуем //если число некорректное, повторяем ввод if not(testh(h)) then writeln('Invalid number, reenter.') until testh(h); b := hextobin(h); //переводим 16 -> 2 writeln('in binary = ', b); //печатаем readln end.
Объяснение кода листинга программы
- Функция testb проверяет корректность двоичного числа. Она удаляет ведущий
+
и-
, проверяет длину числа (не более 8 символов), и проверяет каждую цифру на соответствие0
или1
. Если число некорректное, функция возвращает false, иначе true. - Функция bintohex преобразует двоичное число в шестнадцатеричное. Она удаляет ведущий
+
и-
, определяет знак числа (положительное или отрицательное), затем преобразует строку в число, используя сдвиги и операции И. Шестнадцатеричное число формируется путем вырезания соответствующих разрядов из буфера числа. - Функция normh нормализует шестнадцатеричное число, заменяя символы
a
..f
наA
..F
. - Функция testh проверяет корректность шестнадцатеричного числа. Она удаляет ведущие
+
и-
, проверяет длину числа (не более 2 цифр), и проверяет каждую цифру на соответствие0
..9
илиA
..F
. Если число некорректное, функция возвращает false, иначе true. - Функция hextobin преобразует шестнадцатеричное число в двоичное. Она удаляет ведущий
-
и определяет знак числа. Затем она преобразует шестнадцатеричную строку в число, используя функцию hex1, и формирует двоичное число, начиная с младшего разряда. - Основная программа запрашивает ввод двоичного числа, преобразует его в шестнадцатеричное, выводит результат, затем запрашивает ввод шестнадцатеричного числа, нормализует его, преобразует обратно в двоичное число и выводит результат.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д