Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.26;
Скачать: CL | DM;

Вниз

Массив   Найти похожие ветки 

 
zloy_dima ©   (2003-06-09 12:06) [0]

Есть массив Array [0..31] of boolean. Можно ли как-нибудь быстро узнать что в нем все false, не перебарая все элементы?
Спасибо.


 
Skier ©   (2003-06-09 12:09) [1]


> Можно ли как-нибудь быстро узнать что в нем все false, не
> перебарая все элементы?

Нет.

P.S. А в каких целях используется этот массив ?


 
zloy_dima ©   (2003-06-09 12:12) [2]

Skier © Требуется перебирать очень много таких массивов и большая вероятность что там все false. Нужно время сэкономить.


 
Kaban ©   (2003-06-09 12:14) [3]

comparemem?


 
Юрий Зотов ©   (2003-06-09 12:16) [4]

Если packed array - то CompareMem.


 
zloy_dima ©   (2003-06-09 12:19) [5]

Юрий Зотов © Да packed. Как это сделать c CompareMem?


 
k-man ©   (2003-06-09 12:21) [6]

Где узнать кто есть кто?


 
Palladin ©   (2003-06-09 12:21) [7]

хм, а не проще ли было завести caridnal и рассматривать его как битовый массив


 
k-man ©   (2003-06-09 12:22) [8]

Упс.. Мой пост попал не в тот топик... Может баг в скрипте какой?


 
Skier ©   (2003-06-09 12:23) [9]

>zloy_dima © (09.06.03 12:12)
А сам-то массив зачем используется ?


 
Юрий Зотов ©   (2003-06-09 12:27) [10]

const
Size = 32 * SizeOf(boolean);
var
ZeroArray, Arr: packed array[0..31] of boolean;
...
ZeroMemory(@ZeroArray[0], Size);
...
if CompareMem(@ZeroArray[0], @Arr[0], Size) then ...


 
pasha_golub ©   (2003-06-09 12:31) [11]

Согласен с Палладином (09.06.03 12:21), ( впервые :-) ), лучше использовать не массив.


 
han_malign ©   (2003-06-09 12:41) [12]

Сканирование массива, все таки, побыстрее чем сравнение двух, а если для красоты - то функцию сваять(можно и на асме, но выигрыш небольшой), хотя использование множественных типов, или, в данном конкретном случае, непосредственно битовых (LongWord) масок более обосновано...


 
Doc   (2003-06-09 13:00) [13]

to
> pasha_golub © and Palladin ©
А не могли бы прояснить????

> хм, а не проще ли было завести caridnal и рассматривать
> его как битовый массив




 
Palladin ©   (2003-06-09 13:08) [14]


> han_malign © (09.06.03 12:41)

ну это как всегда, либо скорость и удобство, либо экономия в 8 раз и опыт :)
хотя разница в скорости обработки не очень критична в этом случае... мне кацца...


 
pasha_golub ©   (2003-06-09 13:39) [15]

Могли бы:

1. Берем двоичную систему - это там где нолики или еденички.
2. 1=true, 0=false
3. Тогда любое число в двоичном формате ( 1001 в двоичном = 9 в десятичном) можно представить как массив из n элементов, где n кол-во разрядов.
4. Почему Cardinal? Потому, что у него 32 разряда, а тебе и надо 32.


 
zloy_dima ©   (2003-06-09 13:46) [16]

pasha_golub © Так как быстро перекинуть array[0..31] of false to cardinal?


 
han_malign ©   (2003-06-09 13:50) [17]

>zloy_dima © (09.06.03 13:46)
- его там нужно изначально держать и вообще булевыми массивами не пользоваться...


 
pasha_golub ©   (2003-06-09 13:51) [18]

Быстро:
var C: cardinal;

1. C:=0; C имеет вид: 000000000000000000000000000000 (32шт.)

2. С:=1; 000000000000000000000000000001

3. C:=9; 000000000000000000000000001001

4. C:=9 or 1; 000000000000000000000000001001

5. C:=9+1; 000000000000000000000000001010

etc.


 
zloy_dima ©   (2003-06-09 13:55) [19]

han_malign © без него никак...
Пытался сделать вот как:

var
mas_b:packed array [0..31] of boolean;
d:cardinal;
begin
move(mas_b,d,4);

ebd;

..но получается не то


 
Palladin ©   (2003-06-09 14:00) [20]

я же говорю, опыт..
ты пытаешься 32 байта запихнуть в 32 бита


 
Skier ©   (2003-06-09 14:02) [21]

>zloy_dima © (09.06.03 13:55)
SizeOf(packed array [0..31]) > (и намного !) SizeOf(cardinal)


 
zloy_dima ©   (2003-06-09 14:04) [22]

Palladin © ,Skier © смотрел sizeof(mas_b) выдает 4, а не 32 байта...


 
han_malign ©   (2003-06-09 14:15) [23]

> без него никак
for i:=0 to 31 do mas_b[i]:=Condition(i);

или

dwB:=0;
for i:=0 to 31 do begin
if(Condition(i))then dwB:=$80000000;
dwB:=dwB shr 1;
end;

(dwB<>0)
(dwB and (1 shl i))<>0

или
type TRange = 0..31;
var set_b: set of TRange;
ir: TRange;
begin
set_b:=[];
for ir:=0 to 31 do begin
if(Condition(i))then set_b:=set_b+[ir];//суперпозиция множеств
end;

(set_b<>[])
(ir in set_b)//вхождение
(set_b*[1..3]<>[])//пересечение множеств
..........


 
Palladin ©   (2003-06-09 14:34) [24]


> zloy_dima © (09.06.03 14:04)

сравнивать SizeOf(boolean)*32 и SizeOf(Cardinal)


 
Skier ©   (2003-06-09 14:38) [25]

>zloy_dima © (09.06.03 13:46)
Подводя итог, хочется сказать.:)
Выкинь ты этот массив байт и замени его на LongWord


 
Doc   (2003-06-09 15:35) [26]

Удалено модератором
Примечание: Задай этот ответ в своей ветке


 
Skier ©   (2003-06-09 15:42) [27]

>Doc (09.06.03 15:35)
вооружившись операциями or, and, shr и shl можно
провернуть любое заполнение с любого бита.


 
Doc   (2003-06-09 16:52) [28]

Удалено модератором
Примечание: Задай этот ответ в своей ветке


 
han_malign ©   (2003-06-09 16:57) [29]

Doc (09.06.03 16:52)
- не пойму причем здесь вообще случайные числа (просмотрел еще раз нигде не нашел), но пожалуйста:
if(Random>0.5)then dw:=dw or (1 slh 17) else dw:=dw and not(1 shl 17);


 
Skier ©   (2003-06-09 17:02) [30]

>Doc (09.06.03 16:52)
... or (1 shl 17) - установка бита


 
Chlavik ©   (2003-06-09 17:08) [31]

А помойму лучше просто сравнивать циклом for i:=0 to Length-1(mas)-1 do if mas[i] then break; я думаю что если вы будете заполнять по битам там кардинал .. то быстрее от этого не будет, а нооборот...


 
Skier ©   (2003-06-09 17:10) [32]


> я думаю что если вы будете заполнять по битам там кардинал
> .. то быстрее от этого не будет, а нооборот...

Ошибка.


 
Doc   (2003-06-09 17:20) [33]

Удалено модератором
Примечание: Задай этот ответ в своей ветке


 
Skier ©   (2003-06-09 17:22) [34]


> У меня с побитовыми операциями в голове не очень :(((

Юрий Зотов открыл школу специально для тех у кого не очень.


 
Doc   (2003-06-09 17:29) [35]

Удалено модератором
Примечание: Задай этот ответ в своей ветке


 
Serginio   (2003-06-09 17:31) [36]

Используй
han_malign © (09.06.03 14:15
Set как раз приспособлен для более простого использования побитовых операций и не мучайся.



Страницы: 1 вся ветка

Текущий архив: 2003.06.26;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.017 c
1-84145
DeScriptor
2003-06-08 06:00
2003.06.26
Затруднения с файлом, существование которого находится под сомнен


14-84635
NewN
2003-06-10 08:31
2003.06.26
Деятельность Луны в длинной фазе.


1-84406
duby
2003-06-09 17:21
2003.06.26
Событие


1-84286
Dmk
2003-06-14 21:44
2003.06.26
Как вернуть форму к предыдущему состоянию


8-84467
Intell
2003-03-05 14:19
2003.06.26
Как я могу получить картинку с видео источника?