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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Bits and Byte operation with delphi, how to Read one or more bits from byte 
:(
    Опции темы
Chars House
  Дата 20.2.2004, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Hello All
Как прочитать несколько бит как Intger. Допустим есть 2 Byte надо
прочитать первой старшей 5 бит и 11 бит оставши.

И так же как прочитать число если он записано в 3 байтах (24 бит)
вот и делаю так , но думаю есть вариант по лучшее

procedure ReadBits(sValue: Integer);
var
_5Bits: smallInt;
_11Bits: SmallInt;
begin
_11Bits:= (sValue and $7FF);
_5Bits:=(((sValue and $7FFF)/2048) OR 16)
end;

function Read3Byte(f,nPos: Integer): Integer;
var
m: Array[1..3] of byte;
i,j:integer;
begin
fileseek(f,nPos,0);
fileRead(f,m,3);
j:=m[1];
j:=j shl 16;
i:=m[2];
i:=i shl 8;
inc(j,i);
inc(j,m[3]);
result:=j;
end; smile.gif
PM MAIL   Вверх
December
Дата 21.2.2004, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


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

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



Деление на степень двойки лучше заменить на сдвиг вправо. В остальном вполне нормальный способ.


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
p0s0l
Дата 21.2.2004, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



Цитата
Допустим есть 2 Byte надо
прочитать первой старшей 5 бит и 11 бит оставши.

Это что, по-украински ? smile.gif

В принципе упростить тут вряд ли шибко можно, только не понятно зачем там OR 16 ? Я бы сделал так:
_11Bits := sValue and $7FF;
_5Bits := sValue shr 11;

Я так понял, Read3Byte читает 3 байта и переворачивает их порядок, тогда можно укоротить запись так:
fileSeek(...);
fileRead(...);
Result := (m[1] shl 16) or (m[2] shl 8) or m[3];



--------------------
С уважением, г-н Посол.
PM   Вверх
Chars House
Дата 21.2.2004, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(December @ 21.2.2004, 00:43)
Деление на степень двойки лучше заменить на сдвиг вправо. В остальном вполне нормальный способ.

разве опреацее деление и умножение быстрее чем shr b shl???
PM MAIL   Вверх
December
Дата 21.2.2004, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


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

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



Цитата
разве опреацее деление и умножение быстрее
Вот я ж и говорю, что медленнее.


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
p0s0l
Дата 21.2.2004, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



В принципе у него там что-то напутано, т.к. в smallint пытается записать нецелое число (что-то делится на 2048). По смыслу там должен быть не знак "/", а div...
А если написать div, то Delphi вместо деления на степень двойки откомпилирует сдвиг. Т.е. что писать shr 11, что div 2048 - это практически одно и тоже (только при делении будет учитываться знак - будет не shr, а sar)...



--------------------
С уважением, г-н Посол.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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