Консультация № 169239
10.06.2009, 12:55
0.00 руб.
0 2 2
Здравствуйте. Требуется решение следующей задачи:

Строку – двоичное представление целого числа, преобразуйте в строку – 16-ичное представление этого числа

Заранее спасибо!

Обсуждение

Неизвестный
10.06.2009, 13:36
общий
это ответ
Здравствуйте, Vilgelm.

Код в приложении

Приложение:
{ Строку - двоичное представление целого числа, преобразуйте в строку - 16-ичное представление этого числа }
Program Bin2Hex;

Const
cHexDigit : string = '0123456789ABCDEF';

Var
b : string;
h : string;

i : Byte;
k : Byte;
c : Byte;
l : Byte;
p : Byte;

n : Byte;

Begin
write ('Введите двоичное число: '); readln (b);

{ Выравниваем введенное число до числа двоичных разрядов, кратного 4 }
l := length (b);
k := (4 - l mod 4) mod 4;
for i := 1 to k do b := '0' + b;
Inc (l, k);

{ Переводим число в 16-ричную систему счисления по тетрадам }
i := 1;
h := '';
for k := 1 to l div 4 do
begin
n := 0;
for p := 1 to 4 do
begin
c := ord (b [i]) - ord ('0');
if c in [0, 1] then
n := n shl 1 + c
else begin
writeln ('В записи исходного числа обнаружен некорректный символ: ', b [i]);
halt (1);
end;
Inc (i);
end;
h := h + cHexDigit [n + 1];
end;

writeln ('Шестнадцатеричное число равно: ', h);
End.
Неизвестный
10.06.2009, 14:41
общий
это ответ
Здравствуйте, Vilgelm.
Код:

program Pascal_169236;

type
{* Класс-конвертер *}
TBinary2HexConverter=object
str:String;
function NumConvert(b: String): Char;
public
constructor Init(s: String);
function ToHex: String;
end;

{* Конструктор *}
constructor TBinary2HexConverter.Init(s: String);
var
i: Integer;
skipZeroes:Boolean;
begin
str:='';
{* Флаг сигнализирующий, что ведущие нули еще не пропущены *}
skipZeroes:=true;
for i := 1 to Length(s) do begin
{* Проверка на корректность строки *}
if not (s[i] in ['0','1']) then begin
Fail;
end;
{* Если не ноль или ведущие нули уже пропущены *}
if not(skipZeroes and (s[i]='0') and (i<>Length(s))) then begin
skipZeroes:=false;
str:=str+s[i];
end;
end;
end;

{* конвертирует 4х битовую двоичную строку в шестнадцатиричное число *}
function TBinary2HexConverter.NumConvert(b: String): Char;
const
hexdigits:array[0..15] of char='0123456789ABCDEF';
var
num:Integer;
i: Integer;
begin
num:=0;
for i := 1 to Length(b) do begin
num:=(num shl 1) + (Ord(b[i]) - Ord('0'));
end;
NumConvert:=hexdigits[num];
end;

{* Собственно сам конвертер *}
function TBinary2HexConverter.ToHex: String;
var
cur,len:Integer;
res:String;
begin
res:='';
cur:=1;
while cur<=Length(str) do begin
len:=(Length(str)-cur) mod 4+1;
res:=res+ NumConvert(Copy(str,cur,len));
Inc(cur,len);
end;
ToHex:=res;
end;

var
s:String;
bin:TBinary2HexConverter;

begin
Write('Enter binary number:');
ReadLn(s);
if bin.Init(s) then begin
WriteLn('In Hex:',bin.ToHex);
end else begin
WriteLn('This is not binary number');
end;
ReadLn;
end.

Пример:
Код:

Enter binary number:1001010101011011
In Hex:955B
Форма ответа