![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Chars House |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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; |
|||
|
||||
| December |
|
|||
![]() Antitheorist ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4423 Регистрация: 14.8.2002 Где: Харьков Репутация: 8 Всего: 57 |
Деление на степень двойки лучше заменить на сдвиг вправо. В остальном вполне нормальный способ.
|
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Это что, по-украински ? В принципе упростить тут вряд ли шибко можно, только не понятно зачем там 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]; -------------------- С уважением, г-н Посол. |
|||
|
||||
| Chars House |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 20.2.2004 Репутация: нет Всего: нет |
разве опреацее деление и умножение быстрее чем shr b shl??? |
|||
|
||||
| December |
|
|||
![]() Antitheorist ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4423 Регистрация: 14.8.2002 Где: Харьков Репутация: 8 Всего: 57 |
|
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
В принципе у него там что-то напутано, т.к. в smallint пытается записать нецелое число (что-то делится на 2048). По смыслу там должен быть не знак "/", а div...
А если написать div, то Delphi вместо деления на степень двойки откомпилирует сдвиг. Т.е. что писать shr 11, что div 2048 - это практически одно и тоже (только при делении будет учитываться знак - будет не shr, а sar)... -------------------- С уважением, г-н Посол. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |