Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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; smile.gif

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

Автор: p0s0l 21.2.2004, 00:54
Цитата
Допустим есть 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];

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

разве опреацее деление и умножение быстрее чем 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)...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)