Страница 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:41:31
Дож
FeodoR
http://www.freepascal.org/docs-html/rtl/system/str.html

Добавлено спустя 1 минуту 52 секунды:
update
А, не заметил, что у вас шестнадцатиричная.
http://www.freepascal.org/docs-html/rtl ... tohex.html

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 19: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;