Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.11.17;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.01 c
3-56492
Vemer
2003-10-26 11:01
2003.11.17
(Не)Работа TQRExpr


1-56555
Poof-poof
2003-11-08 01:40
2003.11.17
Как сделать так чтобы форму нельзя было ресайзнуть?


14-56913
Nazarik
2003-10-24 19:56
2003.11.17
Зима пришла!


6-56793
Vint45
2003-09-20 13:33
2003.11.17
Переменные окружения и CGI


14-56855
Neox
2003-10-25 21:21
2003.11.17
Router





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский