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

Вниз

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

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

Наверх





Память: 0.51 MB
Время: 0.028 c
3-83898
malamba
2003-06-03 09:37
2003.06.26
подключение к ODBC


14-84660
Maclud_Maclaud
2003-06-10 13:31
2003.06.26
Неужеле никто не знает как программно регулировать MasterVolume


3-83990
Endi
2003-05-29 20:58
2003.06.26
Условная сборка таблиц


7-84785
Andr_Volk
2003-04-16 05:44
2003.06.26
Как отключить мышь?


14-84592
Empleado
2003-05-27 18:06
2003.06.26
У атеистов могут !





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