Форум: "Основная";
Текущий архив: 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