Главная страница
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.027 c
1-56624
Mouse
2003-11-05 11:49
2003.11.17
Перетаскивание обьектов на мою форму (компонент)


1-56747
Basilio
2003-11-06 15:49
2003.11.17
Исходники diff


1-56673
512 ram
2003-11-05 08:09
2003.11.17
Можно ли с помощью средств Delphi запустить файл


1-56764
SergeySEM
2003-11-06 13:37
2003.11.17
Koi-Dos-Win


7-56926
aterm
2003-09-08 11:15
2003.11.17
Hook на передвижение курсоа мыши