Страница 1 из 1
Поразрядный вывод целого числа
Добавлено: 17.04.2010 09:38:33
FeodoR
По работе регулярно сталкиваюсь с тем, что надо выводить целые числа поразрядно.
Предлагаю всем желающим (если таковые есть) функцию, которая принимает LongWord на вход, а на выходе имеет строку из 32 символов

При желании код оч. легко переводится для всех остальных целочисленных типов.
Код: Выделить всё
function BinaryLongWord(LW : LongWord) : string;
{Возвращает значения разрядов числа в строке (32 символа)}
var
i,n:byte;
const
Digits : array[0..$F] of Char = '0123456789ABCDEF';
begin
n:=1;
SetLength(BinaryLongWord, 32);
for i:=31 downto 0 do
begin
BinaryLongWorg[n] := Digits[Ord(LW and (1 shl i) <> 0)];
Inc(n);
end;
end;
Re: Поразрядный вывод целого числа
Добавлено: 17.04.2010 10:25:47
alexrayne
Это стеб?
Re: Поразрядный вывод целого числа
Добавлено: 17.04.2010 15:43:23
Дож
Re: Поразрядный вывод целого числа
Добавлено: 17.04.2010 22:54:40
FeodoR
IntToHex и IntToStr понятно. Они есть в RTL и ими мы тоже пользуемся.
Здесь чуть другое. То есть:
Надо, например, смотреть состояние 32-разрядного регистра ну, например, платы дискретных сигналов, где 1 сигнал = 1 бит. Причём вывод только при отладке. Для этого и была сделана эта функция.
Ей на вход идёт число. Ну, например, $8445B9B9. На выходе будет строка с битиками: '10000100010001011011100110111001'. Регулярно бывает полезно.

Re: Поразрядный вывод целого числа
Добавлено: 17.04.2010 23:33:12
alexrayne
RTFM, посмотрите System.binStr
Re: Поразрядный вывод целого числа
Добавлено: 11.03.2018 18:27:19
Python
Могу предложить универсальное решение, которому по барабану, какое целое, или даже с плавающей точкой число вы хотите посмотреть:
Код: Выделить всё
// преобразует указанный объект в его двоичное строковое представление
// Если Raw=true, то дополнительные разделители между байтами не используются
// Если Raw=false, то используется разделитель между байтами - пробел
function Buf2StrBin(Buffer:pointer;Len:integer;Raw:boolean=false):string;
var
I:integer;
S:string;
Data:PByteArray absolute Buffer;
begin
if Raw then begin
if Len*8>Max2StrLength then
raise Exception.Create('Buf2StrBin: too long output string');
SetLength(Result,8*Len);
For I:=0 to Len-1 do begin
S:=BinChar[Data^[I] shr 4];
// тут не буду делать цикл, сделаю развёртку, должно получиться побыстрее
Result[I*8+1]:=S[1];
Result[I*8+2]:=S[2];
Result[I*8+3]:=S[3];
Result[I*8+4]:=S[4];
S:=BinChar[Data^[I] and $F];
Result[I*8+5]:=S[1];
Result[I*8+6]:=S[2];
Result[I*8+7]:=S[3];
Result[I*8+8]:=S[4];
end;
end else begin
if Len*9>Max2StrLength then
raise Exception.Create('Buf2StrBin: too long output string');
SetLength(Result,9*Len);
For I:=0 to Len-1 do begin
S:=BinChar[Data^[I] shr 4];
// тут не буду делать цикл, сделаю развёртку, должно получиться побыстрее
Result[I*9+1]:=S[1];
Result[I*9+2]:=S[2];
Result[I*9+3]:=S[3];
Result[I*9+4]:=S[4];
S:=BinChar[Data^[I] and $F];
Result[I*9+5]:=S[1];
Result[I*9+6]:=S[2];
Result[I*9+7]:=S[3];
Result[I*9+8]:=S[4];
Result[I*9+9]:=' ';
end;
SetLength(Result,Len*9-1); // обрезать последний пробел
end;
end;
// преобразует двоичное представление в указанный объект
procedure Str2BufBin(Buffer:pointer;const Encoded:string);
const
InvalidChar='Str2BufHex: invalid character "%s" at position %d';
var
I:integer;
Data:PByteArray absolute Buffer;
begin
if (Length(Encoded)>=9) and (Encoded[9]<>' ') then begin
if Length(Encoded) mod 8<>0 then
raise Exception.Create('Str2BufBin: invalid encoded string length');
For I:=0 to Length(Encoded) div 8-1 do
Data^[I]:=0;
For I:=1 to Length(Encoded) do begin
case Encoded[I] of
'0':Data^[(I-1) div 8]:=Data^[(I-1) div 8] shl 1;
'1':Data^[(I-1) div 8]:=(Data^[(I-1) div 8] shl 1) or 1;
else raise Exception.CreateFmt(InvalidChar,[Encoded[I],I]);
end;
end;
end else begin
if Length(Encoded) mod 9<>8 then
raise Exception.Create('Str2BufBin: invalid encoded string length');
For I:=0 to Length(Encoded) div 9-1 do
Data^[I]:=0;
For I:=1 to Length(Encoded) do begin
if I mod 9=0 then begin
if Encoded[I]=' ' then continue;
raise Exception.CreateFmt(InvalidChar,[Encoded[I],I]);
end;
case Encoded[I] of
'0':Data^[I div 9]:=Data^[I div 9] shl 1;
'1':Data^[I div 9]:=(Data^[I div 9] shl 1) or 1;
else raise Exception.CreateFmt(InvalidChar,[Encoded[I],I]);
end;
end;
end;
end;