Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.17;
Скачать: CL | DM;

Вниз

помогите оптимизировать   Найти похожие ветки 

 
tnn   (2003-11-06 03:36) [0]

задача из массива байт(представим что это просто строка) проверить установлен ли определенный бит , к примеру 123й

arr: array[0..32] of byte;
x, z :byte;

function DecToNbit(x:byte):byte ;
begin
case (x mod 8) of
0: result:=$01;
1: result:=$02;
2: result:=$04;
3: result:=$08;
4: result:=$10;
5: result:=$20;
6: result:=$40;
7: result:=$80;
else Result:=0;
end;
end;

x:=123;
z:=DecToNbit(x);
if (arr[(x div 8)] and z )<>0 then // бит установлен

работает , но как то коряво у меня это получилось


 
default ©   (2003-11-06 04:01) [1]

можешь использовать множества(если твой массив не превышает 32 байт)


 
tnn   (2003-11-06 04:08) [2]

спасибо за ответ , 32 байта не превышает ...

нельзя ли небольшой примерчик , никогда с множествами не работал ..


 
default ©   (2003-11-06 04:20) [3]


вот:
var
Mn: Set of Char;
begin
Mn := [ #0]; // установка 0-ого бита
Mn := Mn + [ #3]; // установка 3-ого бита
Mn := Mn + [ #7, #15]; // установка 7-ого и 15-ого битов
Mn := Mn - [ #7]; // сброс 7-ого бита
// множество состоит из 256 бит
if #3 in Mn then // проверка установки третьего бита и тд

вот такие пироги


 
tnn   (2003-11-06 04:32) [4]

биты в множестве трогать не нужно , только проверить

у меня есть 32 байта и есть номер (в переменной n:byte) бита который нужно проверить , получается мне 32 байта нужно просто переместить каким-то образом в множество , и потом по известному , но не постоянному , номеру проверить бит

if #3 in Mn then , как я вместо #3 подставлю значение из переменной ?


 
default ©   (2003-11-06 04:37) [5]

if Chr(n) in Mn then ...
(или множество делай var Mn: Set Of Byte, тогда просто
if n in Mn then ...)
поместить свои данные во множество думаю сможешь


 
tnn   (2003-11-06 04:42) [6]

еще раз сенькс , буду испытывть ...


 
Stratos ©   (2003-11-06 07:45) [7]

а есть еще такая вещь как ассемблер...

z:= x shr 3;// номер байта
// (x and $07) - смещение бита в байте
// собственно, это есть x mod 8 - только быстрее
if (arr[z] and (1 shl (x and $07)) then
begin
// do smth
end;

shr - двоичный сдвиг вправо
shl - двоичный сдвиг влево


 
tnn   (2003-11-07 18:52) [8]

function BitInByte(nBit, bByte :byte):boolean ;
begin
result:=(bByte and 1 shl (nBit mod 8))<>0;
end;


x:=15 ; // искомый бит
b:=arr[i] ; // в этом байте

if BitInByte(x , b) then ...;

вот вроде окончательное решение...


 
tnn   (2003-11-07 18:53) [9]

т.е. конечно

function BitInByte(nBit, bByte :byte):boolean ;
begin
result:=(bByte and (1 shl (nBit mod 8)) )<>0;
end;


 
default ©   (2003-11-07 18:54) [10]

да это всё понятно, только медленней будет(ИМХО)



Страницы: 1 вся ветка

Текущий архив: 2003.11.17;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.024 c
1-56726
RoLeX
2003-11-06 17:33
2003.11.17
Когда разница между Edit1.text и Edit2.text больше 14342, о прога


8-56779
Hatawa
2003-07-20 18:17
2003.11.17
Почему StretchBlt при использовании портит рисунок?


7-56927
Sable
2003-09-08 02:40
2003.11.17
Help!!! Подскажите как работать с *.doc


1-56616
_Agent_
2003-11-05 18:15
2003.11.17
Вопрос по Thread, мож кто прояснит в чём дело...(3)


7-56922
Khloo!
2003-09-08 13:34
2003.11.17
Com- порты