Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.015 c
14-56818
Nelud
2003-10-23 12:35
2003.11.17
Нужна здоровая критика!


1-56627
Deb
2003-11-05 00:28
2003.11.17
проблема с созданием Popup


1-56572
Василиск
2003-11-06 11:14
2003.11.17
Как узнать handle активной на данный момент формы?


4-56962
Maxim Pshevlotsky
2003-09-02 08:57
2003.11.17
Как заменить значок из ресурсов DLL?


14-56837
Bovdur
2003-10-27 14:50
2003.11.17
размер ехе-шника.




   Наверх