Главная страница
    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
14-56885
y-soft
2003-10-25 09:37
2003.11.17
Вот, дедом стал!


1-56605
Micah'GF
2003-11-05 22:12
2003.11.17
Чем очистить TImage


1-56599
GIGorON
2003-11-06 08:43
2003.11.17
Передача параметра


4-56957
Marat_n
2003-09-22 21:41
2003.11.17
программа, работающая во время простоя системы


1-56664
Raduga
2003-11-05 09:27
2003.11.17
MsgWaitForMultipleObjectsEx





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский