Dec2Hex (без огpаничения на вводимое число)?
(Akzhan Abdulin 2:5040/55)
function dec2hex(value: dword): string[8]; const hexdigit = '0123456789ABCDEF'; begin while value <> 0 do begin dec2hex := hexdigit[succ(value and $F)]; value := value shr 4; end; if dec2hex = '' then dec2hex := '0'; end;
Оставить комментарий
Комментарии
1.
20 сентября 2005, 08:55:23
%Если кому поможет... написано на Matlab
function s=real2bin(d,z);
%
%REAL2BIN Преобразует действительное число в двоичную строку.
% REAL2BIN(D) возвращает двоичное представление D как сторку.
% D должен быть положительным double меньшим чем 2^52.
%
% REAL2BIN(D,Z) Создаёт двоичное представление действительного числа с
% дробной частью в Z разрядов
%
% Например
% REAL2BIN(28.739) возвращает '11100,1011110100101111'
%
% Смотри также DEC2BIN, BIN2DEC, DEC2HEX, DEC2BASE.
%
% Copyright 1984-2004 Зинаков Иван.
% REAL2BIN v1.0.1. Date: 30.03.04 0:57:23
% Base: Hans Olsson, hanso@dna.lth.se 3-23-95
% Copyright 1984-2002 The MathWorks, Inc.
% $Revision: 1.13 $ $Date: 2002/04/09 00:33:33 $
%
% Входной контроль
%
if nargin==0, error('Не хватает входных аргументов.'); end
if isempty(d), s = ''; return, end
d = d(:); % d - вектор
if (nargin<2) | z>52
z=15; % Установка количества разрядов.
else
if prod(size(z))~=1 | z<0, error('Z должен быть положительным скаляром'); end
z = round(z); % Установить Z положительным.
end;
n=1;
% begin dec2bin
[f,e]=log2(max(d)); % Определение количества разрядов
s=setstr(rem(floor(d*pow2(1-max(n,e):0)),2)+'0');
% end dec2bin
format long g
b=2;
s=[s '.'];
% M=[];
m=d-floor(d);
for ii=0:z
m=m*b;
% M=[M m];
s=[s int2str(floor(m))];
if m>=1, m=m-1; end
end;
function s=real2bin(d,z);
%
%REAL2BIN Преобразует действительное число в двоичную строку.
% REAL2BIN(D) возвращает двоичное представление D как сторку.
% D должен быть положительным double меньшим чем 2^52.
%
% REAL2BIN(D,Z) Создаёт двоичное представление действительного числа с
% дробной частью в Z разрядов
%
% Например
% REAL2BIN(28.739) возвращает '11100,1011110100101111'
%
% Смотри также DEC2BIN, BIN2DEC, DEC2HEX, DEC2BASE.
%
% Copyright 1984-2004 Зинаков Иван.
% REAL2BIN v1.0.1. Date: 30.03.04 0:57:23
% Base: Hans Olsson, hanso@dna.lth.se 3-23-95
% Copyright 1984-2002 The MathWorks, Inc.
% $Revision: 1.13 $ $Date: 2002/04/09 00:33:33 $
%
% Входной контроль
%
if nargin==0, error('Не хватает входных аргументов.'); end
if isempty(d), s = ''; return, end
d = d(:); % d - вектор
if (nargin<2) | z>52
z=15; % Установка количества разрядов.
else
if prod(size(z))~=1 | z<0, error('Z должен быть положительным скаляром'); end
z = round(z); % Установить Z положительным.
end;
n=1;
% begin dec2bin
[f,e]=log2(max(d)); % Определение количества разрядов
s=setstr(rem(floor(d*pow2(1-max(n,e):0)),2)+'0');
% end dec2bin
format long g
b=2;
s=[s '.'];
% M=[];
m=d-floor(d);
for ii=0:z
m=m*b;
% M=[M m];
s=[s int2str(floor(m))];
if m>=1, m=m-1; end
end;
2.
31 июля 2005, 01:46:12
Извините, но это не dec2hex, это bin2hex!
Данные в переменной value -- двоичные (dword -- 32 bit integer).
Далее, используется операция ПОБИТОВОГО сдвига (которая работает над двоичными битами).
Так что тот факт, что программист может написать
string := dec2hex(123456);
еще не о чем не говорит. Компилятор в любом случае преобразовывает данные в двоичную систему счисления. Если б можно было так:
string := dec2hex('123456');
и функция производила разбор строки, деление с остатком и т. д. (полное "честное" преобразование), то это и было бы преобразование из десятичной в шестнадцатеричную.
Данные в переменной value -- двоичные (dword -- 32 bit integer).
Далее, используется операция ПОБИТОВОГО сдвига (которая работает над двоичными битами).
Так что тот факт, что программист может написать
string := dec2hex(123456);
еще не о чем не говорит. Компилятор в любом случае преобразовывает данные в двоичную систему счисления. Если б можно было так:
string := dec2hex('123456');
и функция производила разбор строки, деление с остатком и т. д. (полное "честное" преобразование), то это и было бы преобразование из десятичной в шестнадцатеричную.
3.
3 июля 2005, 16:11:08
Извините, две ошибки.
Строка 2: результат функции, конечно же будет '1', что с методической точки зрения не важно.
Строка 11: символ $ заменить на @.
Строка 2: результат функции, конечно же будет '1', что с методической точки зрения не важно.
Строка 11: символ $ заменить на @.
4.
3 июля 2005, 16:01:15
Рекомендую выполнять тестовые прогоны.
Имеем: dec2hex ($1234) => '4'
Причина - строка №7 - результату приваивается значение равное одному символу! Кроме того, прямое присвоение значения переменной @Result в цикле (что и делается в этой строке) не рекомендуется.
Есть несколько вполне очевидных способов исправления.
Два первых попавшихся:
1. после первого begin
@Result = '';
в строке присвоения @Result = @Result + hexdigit...
2. после первого begin
$Result[0] = 0; { что, вобщем-то, то же самое}
в присвоении
@Result[byte(Succ(@Result[0]))] := ...
Inc (@Result[0]);
и так можно до бесконечности.
Имеем: dec2hex ($1234) => '4'
Причина - строка №7 - результату приваивается значение равное одному символу! Кроме того, прямое присвоение значения переменной @Result в цикле (что и делается в этой строке) не рекомендуется.
Есть несколько вполне очевидных способов исправления.
Два первых попавшихся:
1. после первого begin
@Result = '';
в строке присвоения @Result = @Result + hexdigit...
2. после первого begin
$Result[0] = 0; { что, вобщем-то, то же самое}
в присвоении
@Result[byte(Succ(@Result[0]))] := ...
Inc (@Result[0]);
и так можно до бесконечности.