Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2008, 06:34   #1
odi_noki
Пользователь
 
Регистрация: 23.06.2008
Сообщений: 77
По умолчанию выделить бит

Задача такая: нужно выделить бит в байте, то есть написать функцию, которая выдает значение истина, если n-ый бит (считая "справа" с 0) в байте равен 1, и ложь - если равен нулю.
function Bit1(bt,n:byte):boolean;
написала че-то на ассемблере, но как-то на удивление громоздко получилось, может кто подскажет как это сделать на паскале?
odi_noki вне форума Ответить с цитированием
Старый 11.10.2008, 08:06   #2
AVer
Андрей
Форумчанин
 
Аватар для AVer
 
Регистрация: 21.11.2006
Сообщений: 457
По умолчанию

Код:
Function Bit1(Bt,N:Byte):Boolean;
Var S,S1:String;
    I:Integer;
Begin
S:='';
While Bt <> 1 Do
 Begin
 I:=Bt mod 2;
 Bt:=Bt div 2;
 Str(I,S1);
 S:=S1+S;
 End;
S:='1'+S;
While Length(S) < 8 Do
S:='0'+S;
S:=S[N];
If S = '1' Then Bit1:=True Else Bit1:=False;
End;
ICQ: 5311314
[SIGPIC][/SIGPIC]
AVer вне форума Ответить с цитированием
Старый 11.10.2008, 20:18   #3
odi_noki
Пользователь
 
Регистрация: 23.06.2008
Сообщений: 77
По умолчанию

тоже не очень быстро, работа со строкой... а Str - это функция паскаля? мне б желательно чтобы процедурка быстро работала, п.ч. нужна для прорисовки графики, может с командами shr и shl кто че посоветует?
odi_noki вне форума Ответить с цитированием
Старый 11.10.2008, 22:03   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а если так:
Код:
const
   NMask:array [0..7] of byte = (1,2,4,8,16,32,64,128);

Function Bit1(Bt,N:Byte):Boolean;
begin
  Bit1 := (Bt and NMask[N])<>0;
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.10.2008, 22:31   #5
odi_noki
Пользователь
 
Регистрация: 23.06.2008
Сообщений: 77
По умолчанию

о, вот это уже интереснее, кажется работает.. только есть проблемка с пониманием: and сравнивает побитово, как в асме? и что он дает в результате?
odi_noki вне форума Ответить с цитированием
Старый 12.10.2008, 01:11   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

гм. А мне казалось, что это очевидно...

в данном случае к одному байту производится операция логического И с другим байтом (сама операция разумеется битовая). В качестве байта второго берём маску (имя массива смотри :-)
(0-й бит - маска 1 : XXXXXXXX and 00000001
1-й бит - маска 2: XXXXXXXX and 00000010
и т.д.
7-й бит маска 128: XXXXXXXX and 10000000)
разумеется, маску можно получать сдвигом 1 влево на N-1 позиций... возможно, что это будет даже быстрее, чем брать маску из массива...

Полученное число (после логического И) сравниваем - если = 0 значит требуемый бит был нулевой, иначе, бит не нулевой.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.10.2008, 11:59   #7
odi_noki
Пользователь
 
Регистрация: 23.06.2008
Сообщений: 77
По умолчанию

Все ясно, просто не знала, что в паскале тоже есть побитовый and, в этом наверно и была проблема. Прописала сдвиг единицы вместо маски, теперь все отлично работает, как раз то, что нужно. Спасибо огромное.
odi_noki вне форума Ответить с цитированием
Старый 12.10.2008, 16:24   #8
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
Лампочка Asm

Цитата:
Сообщение от odi_noki Посмотреть сообщение
написала че-то на ассемблере, но как-то на удивление громоздко получилось
Не так уж и громоздко
Pascal + ассемблер
Код:
function BitSet(Number: Word; Bit: Byte): Boolean; assembler;
asm
mov ax, 1
mov cl, [Bit]
shl ax, cl
xor dx, dx
test [Number], ax
jz @end
inc dx
@end:
mov ax, dx
end;
Delphi + нормальный ассемблер
Код:
function BitSet(Number, Bit: Cardinal): Boolean;
asm
bt eax, edx
setc al
end;
Somebody вне форума Ответить с цитированием
Старый 13.10.2008, 19:43   #9
odi_noki
Пользователь
 
Регистрация: 23.06.2008
Сообщений: 77
По умолчанию

Somebody,
Вот такая вещь shl ax, cl у меня не компилируется. Ну ее конечно циклом можно заменить. Или чето в настройках покрутить? Пускай уж будет на паскале в 3 строчки, не намного медленнее)
И еще - что такое нормальный ассемблер?
odi_noki вне форума Ответить с цитированием
Старый 13.10.2008, 23:12   #10
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от odi_noki Посмотреть сообщение
Вот такая вещь shl ax, cl у меня не компилируется.
Странно, у меня компилируется. TP70
Цитата:
Сообщение от odi_noki Посмотреть сообщение
И еще - что такое нормальный ассемблер?
Я имел в виду ассемблер, который понимает инструкции не только 286-го процессора, но и более современных (в данном случае 386).
Somebody вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выделить Диапозон Rom1k06 Microsoft Office Excel 4 01.09.2008 22:18
Выделить выходные gavrylyuk Microsoft Office Excel 5 01.08.2008 13:28
1 байт 9 бит ?! Иллидан Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 13.04.2008 12:47
Выделить страницу StasSv Microsoft Office Excel 7 28.02.2008 10:34
выделить строки Romuald Microsoft Office Excel 7 22.02.2008 04:58