var f:tfilestream;
s:string;
i:integer;
b:byte;
Begin
f:=TFileStream.Create('test.txt',fmOpenRead);
f.readBuffer(b,1);
Требуется ПОБИТНО выводить информацию как это сделать в Delphi?
В некоторых методах сжатия (Например Хофмана) требуется побитно выводить информацию. Расскажите как это сделать в Delphi? Говорят нужно использовать сдвиги, как это сделать? Кто знает какие способы? Расскажите пожалуйста поподробнее, если можно с примерами.
Напрямую никак. Используй сдвиги, or,xor,and....
Цитата: Lone Wolf
Напрямую никак. Используй сдвиги, or,xor,and....
Про сдвиги он и сам догадался...
Минимальной доступной единицей является байт.
Сперва ты этот байт читаешь.
Код:
Потом ты этот байт можешь распилить на биты.
например первый бит (b and 1), второй (b and 2), третий (b and 4),
n+1-ый (b and (1 shl n))
Действует это так:
еденица (в бинарном виде:00000001) сдвигается влево на n (сдвиг вправо shr), получаем, например при n=2, 00000100, потом оператор and выделяет те биты, которые в обоих операндах равны 1.
Вот так переводится число в строку ПОБИТОВО.
Код:
for i:=7 DownTo 0 do s:=s+inttostr(b and (1 shl n));
Про побитовые операции наверно на форуме где-то есть, но объясню:
shl-побитовый сдвиг влево ( 101 shl 3=101000)
shr-побитовый сдвиг вправо ( 101 shr 2=1)
and-побитовое и (111000 and 101101=101000)
or-побитовое или (111000 or 101101=111101)
xor-побитовое исключающее или (получает единицу если соотв биты неравны
111000 xor
101101=
010101)
примечательно, что ((x xor y)xor y)=x
not-инверсия (not 111000=000111)
При побитовых сдвигах надо учитывать возмодность выхода за разрядную сетку.
например (1 shl 8) при приведении к типу байт превратиться в 0.
А функцию IntToBin уже отменили?
Цитата: IL84
А функцию IntToBin уже отменили?
Ну во первых: в моей стандартной поставке делфи ее не нашлось...
И 1 вопрос у меня: что делает функция?
Если я тебя правильно понял то так:
function IntToBin(const X:int):string;
Какой смысл от такой функции в алгоритме хаффмана?
Функция определена в IdGlobalProtocols. Насколько я понял вопрос стоял "побитно выводить информацию", что значит отображать ее на экране.
Код:
for i:=7 DownTo 0 do s:=s+inttostr(b and (1 shl n));
Будет фигня и даже не из-за описки в n.
Код:
for i:=7 DownTo 0 do s:=s+inttostr ( (b shr i) and $01) ;
Так работать будет:) .
А подход единственно верный.
Если бы не было доступа к битовым операциям можно было бы искать остатки:)