Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 12588
Последний выпуск: 9.07.2014

Вопросы и ответы - Форум

Требуется ПОБИТНО выводить информацию как это сделать в Delphi?

0спам
26K
07 апреля 2007 года
S340
2 / / 07.04.2007
В некоторых методах сжатия (Например Хофмана) требуется побитно выводить информацию. Расскажите как это сделать в Delphi? Говорят нужно использовать сдвиги, как это сделать? Кто знает какие способы? Расскажите пожалуйста поподробнее, если можно с примерами.
101
07 апреля 2007 года
Lone Wolf
1.3K / / 26.11.2006
Напрямую никак. Используй сдвиги, or,xor,and....
3.0K
08 апреля 2007 года
Sania
186 / / 28.10.2006
Цитата: Lone Wolf
Напрямую никак. Используй сдвиги, or,xor,and....


Про сдвиги он и сам догадался...

Минимальной доступной единицей является байт.

Сперва ты этот байт читаешь.

 
Код:
var f:tfilestream;
s:string;
i:integer;
b:byte;
Begin
f:=TFileStream.Create('test.txt',fmOpenRead);
f.readBuffer(b,1);


Потом ты этот байт можешь распилить на биты.
например первый бит (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.
308
08 апреля 2007 года
IL84
267 / / 24.04.2003
А функцию IntToBin уже отменили?
3.0K
10 апреля 2007 года
Sania
186 / / 28.10.2006
Цитата: IL84
А функцию IntToBin уже отменили?


Ну во первых: в моей стандартной поставке делфи ее не нашлось...

И 1 вопрос у меня: что делает функция?
Если я тебя правильно понял то так:
function IntToBin(const X:int):string;

Какой смысл от такой функции в алгоритме хаффмана?

308
10 апреля 2007 года
IL84
267 / / 24.04.2003
Функция определена в IdGlobalProtocols. Насколько я понял вопрос стоял "побитно выводить информацию", что значит отображать ее на экране.
28K
25 апреля 2007 года
tartilla
1 / / 25.04.2007
 
Код:
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) ;

Так работать будет:) .
А подход единственно верный.
Если бы не было доступа к битовым операциям можно было бы искать остатки:)

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог