| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Bits and Byte operation with delphi |
| Автор: Chars House 20.2.2004, 18:48 |
| 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 21.2.2004, 00:43 |
| Деление на степень двойки лучше заменить на сдвиг вправо. В остальном вполне нормальный способ. |
| Автор: p0s0l 21.2.2004, 00:54 | ||
Это что, по-украински ? В принципе упростить тут вряд ли шибко можно, только не понятно зачем там 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 21.2.2004, 09:47 | ||
разве опреацее деление и умножение быстрее чем shr b shl??? |
| Автор: December 21.2.2004, 12:47 | ||
|
| Автор: p0s0l 21.2.2004, 15:07 |
| В принципе у него там что-то напутано, т.к. в smallint пытается записать нецелое число (что-то делится на 2048). По смыслу там должен быть не знак "/", а div... А если написать div, то Delphi вместо деления на степень двойки откомпилирует сдвиг. Т.е. что писать shr 11, что div 2048 - это практически одно и тоже (только при делении будет учитываться знак - будет не shr, а sar)... |