Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вывести integer в виде массива бит 
:(
    Опции темы
СЭНСЭЙ
Дата 6.4.2009, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Привет всем.
Подскажите как попроще вывести значение integer (к примеру) в виде массива бит
PM MAIL   Вверх
CodeMonkey
Дата 6.4.2009, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Я бы сделал как-то так (писал на коленке, могут быть ошибки):
Код
function ByteToBinStr(const B: Byte): String; // байт в строку битов
const
  C: array[0..15] of String = ('0000', '0001', '0010', '0011',
                                             '0100', '0101', '0110', '0111',
                                             '1000', '1001', '1010', '1011',
                                             '1100', '1101', '1110', '1111');
begin
  Result := C[B shr 4] + C [B and $F];
end;

function IntToBitStr(const I: Integer): String; // Integer в строку битов
begin
   Result := ByteToBinStr(I shr 24) + 
                  ByteToBinStr(I shr 16) + 
                  ByteToBinStr(I shr 8)
                  ByteToBinStr(I);
end;



--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
СЭНСЭЙ
Дата 6.4.2009, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 432
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Хм.. Очень интересно и красиво!!!
А попроще никак?
PM MAIL   Вверх
CodeMonkey
Дата 6.4.2009, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Попроще - это как? Типа, чтоб препод сразу понял, что сами писали? smile 


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
MetalFan
Дата 6.4.2009, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



накидал на коленке "по проще".
Код

function BufToBit( ABuf: Integer ): string;
var
  i: Integer;
begin
  SetLength(Result, 36 );
  for i := SizeOf(ABuf)*8 downto 1 do
  begin
    if (ABuf and $1)=1 then
      Result[i] := '1'
    else
      Result[i] := '0';
    ABuf := ABuf shr 1;
  end;
end;

ABuf можно обозначить любым простым типом.
з.ы. но в коде есть ошибка smile найдешь - молодец

Это сообщение отредактировал(а) MetalFan - 6.4.2009, 11:28


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Андре
Дата 6.4.2009, 14:09 (ссылка) |  (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 23.3.2009

Репутация: нет
Всего: нет



Берем готовую функцию IntToHex и модернизируем немножко.
Код

procedure CvtInt; 
{ IN:
    EAX:  The integer value to be converted to text
    ESI:  Ptr to the right-hand side of the output buffer:  LEA ESI, StrBuf[16]
    ECX:  Base for conversion: 0 for signed decimal, 10 or 16 for unsigned
    EDX:  Precision: zero padded minimum field width
  OUT:
    ESI:  Ptr to start of converted text (not start of buffer)
    ECX:  Length of converted text
}
asm
        OR      CL,CL
        JNZ     @CvtLoop
@C1:    OR      EAX,EAX
        JNS     @C2
        NEG     EAX
        CALL    @C2
        MOV     AL,'-'
        INC     ECX
        DEC     ESI
        MOV     [ESI],AL
        RET
@C2:    MOV     ECX,10

@CvtLoop:
        PUSH    EDX
        PUSH    ESI
@D1:    XOR     EDX,EDX
        DIV     ECX
        DEC     ESI
        ADD     DL,'0'
        CMP     DL,'0'+10
        JB      @D2
        ADD     DL,('A'-'0')-10
@D2:    MOV     [ESI],DL
        OR      EAX,EAX
        JNE     @D1
        POP     ECX
        POP     EDX
        SUB     ECX,ESI
        SUB     EDX,ECX
        JBE     @D5
        ADD     ECX,EDX
        MOV     AL,'0'
        SUB     ESI,EDX
        JMP     @z
@zloop: MOV     [ESI+EDX],AL
@z:     DEC     EDX
        JNZ     @zloop
        MOV     [ESI],AL
@D5:
end;

function IntToAny(Value: Integer; Digits: Integer): string;
//  FmtStr(Result, '%.*x', [Digits, Value]);
asm
        CMP     EDX, 32        // Digits < buffer length?
        JBE     @A1
        XOR     EDX, EDX
@A1:    PUSH    ESI
        MOV     ESI, ESP
        SUB     ESP, 32
        PUSH    ECX            // result ptr
        MOV     ECX, 2        // ну а тут нужную нам систему счисления :)
        CALL    CvtInt
        MOV     EDX, ESI
        POP     EAX            // result ptr
        CALL    System.@LStrFromPCharLen
        ADD     ESP, 32
        POP     ESI
end;

PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 6.4.2009, 14:23 (ссылка) |  (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(Андре @  6.4.2009,  13:09 Найти цитируемый пост)
Берем готовую функцию IntToHex и модернизируем немножко.

нда.. форум то по паскалю, а не по асму. И вобще в чем смысл то, делать непереносимым решение для задачи, не требущей критической оптимизации ?!



--------------------
PM MAIL WWW   Вверх
marinovsoft
Дата 6.4.2009, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 25.1.2009
Где: Кемерово

Репутация: нет
Всего: нет



Вот, писал на коленках:
Код

function byte2bit(b:byte):String;
var i:byte;
    tmpStr:String;
const bit_arr:array[1..8] of byte=($1,$2,$4,$8,$10,$20,$40,$80);

begin
   tmpStr:='';
   for i:=1 to 8 do
   if (b and bit_arr[i])=bit_arr[i] then
      tmpStr:='1'+tmpStr
   else tmpStr:='0'+tmpStr;
   byte2bit:=tmpStr;
end;


А это из работающей программы скопировано 

Код

Const
      Arr1:Array[1..8] of byte=($1,$2,$4,$8,$10,$20,$40,$80);
Procedure Write_Byte(B:Byte);
Var
  i:Byte;
begin
     Write_bit_0;  { startovi bit }
     For i:=1 to 8 do
      If (B And Arr1[i])=Arr1[i] then
         Write_bit_1
      else
         Write_bit_0;
     Write_bit_1;  { 1st stopovi bit }
     Write_bit_1;  { 2nd stopovi bit }
end;


Сама работающая программа здесь _http://marinovsoft.narod.ru/korvet/msxcas.rar
PM MAIL WWW ICQ   Вверх
MetalFan
  Дата 6.4.2009, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



имхо у миня лучче всех получилось) smile  smile 


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
CodeMonkey
Дата 6.4.2009, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Цитата(MetalFan @  6.4.2009,  15:37 Найти цитируемый пост)
имхо у миня лучче всех получилось)    

Я так думаю, что каждому свой вариант нравится лучше остальных ;)


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
mes
Дата 6.4.2009, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(MetalFan @  6.4.2009,  14:37 Найти цитируемый пост)
имхо у миня лучче всех получилось) smile  smile 

 но откуда взялось 36 ?!  smile 
Цитата(MetalFan @  6.4.2009,  10:27 Найти цитируемый пост)
 SetLength(Result, 36 );




Это сообщение отредактировал(а) mes - 6.4.2009, 15:57


--------------------
PM MAIL WWW   Вверх
CodeMonkey
Дата 6.4.2009, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Цитата(mes @  6.4.2009,  15:56 Найти цитируемый пост)
 но откуда взялось 36 ?! ;)

А вдруг чо! О_О  smile 


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Akella
Дата 6.4.2009, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(mes @  6.4.2009,  15:56 Найти цитируемый пост)
но откуда взялось 36 ?!  smile 

Как это откуда? Со справочника Стэля.
PM MAIL   Вверх
MetalFan
Дата 6.4.2009, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(Akella @  6.4.2009,  16:02 Найти цитируемый пост)
Как это откуда? Со справочника Стэля. 

хтоето???  smile 
а взялось из SizeOf( Integer ) * 8


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
mopsa
Дата 6.4.2009, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 11.1.2009
Где: Екатеринбург/Асбе ст

Репутация: нет
Всего: 1



Цитата(MetalFan @ 6.4.2009,  19:27)
а взялось из SizeOf( Integer ) * 8

но это будет 32
но метод MetalFan`a после небольшой поправки мне кажется лучьшим
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0600 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.