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