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

Вниз

Как быстро выполнить операцию?   Найти похожие ветки 

 
Dmitry S ©   (2008-08-18 16:06) [0]

Пусть даны два числа:
01001001001001001001001001001001 - 1. маска
00000111010110111100110100010101 - 2. данные

Из второго числа (данные) выбираем те биты, которые в маске равны 1:
-0--0--1--0--0--1--0--0--0--0--1 - 3.
затем "складываем" биты:
---------------------00100100001 - 4.

Как можно быстро выполнить данную операцию (имея числа 1. и 2., получить число 4.)? И обратную (имея числа 4. и 1., получить 2.).


 
Рамиль ©   (2008-08-18 16:11) [1]

AND и сдвигать?

> И обратную (имея числа 4. и 1., получить 2.).

Действия необратимы.


 
Рамиль ©   (2008-08-18 16:13) [2]

Не, неправильно прочитал.


 
Ega23 ©   (2008-08-18 16:14) [3]

Обратно - в принципе никак.

R=число_1 and число_2;
cnt=0;
while (R>0) do
begin
 cnt := cnt + (R and 1);
 R := shr 1;
end;


 
Dmitry S ©   (2008-08-18 16:18) [4]


> Обратно - в принципе никак.

Забыл уточнить. В обратной задачи те биты, которые в маске равны нулю не имеют значения. Можно установить их в 0.


 
Pavia ©   (2008-08-18 16:18) [5]

3 число через and.
4. Используетм табличку 256*256 со сдвинутами битами По вертикали маски по горизонтали данные. В самой табличке хранить сдвинутые биты
плюс в нейже хранить число бит в маске. окончательный результат через сдвиги и and.


 
Smile   (2008-08-18 16:19) [6]


> Dmitry S ©   (18.08.08 16:06)
> И обратную (имея числа 4. и 1., получить 2.).

Чтобы не "париться" с обратно, просто запоминай
> 00000111010110111100110100010101 - 2. данные


 
DiamondShark ©   (2008-08-18 16:34) [7]


> Dmitry S ©   (18.08.08 16:18) [4]
> > Обратно - в принципе никак.Забыл уточнить. В обратной
> задачи те биты, которые в маске равны нулю не имеют значения.
>  Можно установить их в 0.

Можно установить, а можно не установить -- всё равно однозначного обратного преобразования нет:

маска 1100
данные 1000
=1

маска 1100
данные 0100
=1

ну и какой результат должна выдавать обратная функция для 1?


 
Rouse_ ©   (2008-08-18 16:35) [8]


> Smile

+1 :)))


 
Dmitry S ©   (2008-08-18 16:42) [9]


> Можно установить, а можно не установить -- всё равно однозначного
> обратного преобразования нет:
>
> маска 1100
> данные 1000
> =1
>
Тут результат будет 10, а не 1.
Результат обратной операции будет "10xx". где xx - два, не важно каких, бита :)


 
han_malign ©   (2008-08-18 17:35) [10]

pack
src_mask:= 1;
dst_mask:= 1;
result:= 0;
while(src_mask)do begin
   if(mask and src_mask <> 0)then begin
        if(val and src_mask <> 0)then
           result:= result or dst_mask;
        dst_mask:= dst_mask shl 1;
   end;
   src_mask:= src_mask shl 1;
end;
unpack
src_mask:= 1;
dst_mask:= 1;
result:= 0;
while(src_mask)do begin
   if(mask and src_mask <> 0)then begin
        if(val and dst_mask <> 0)then
           result:= result or src_mask;
        dst_mask:= dst_mask shl 1;
   end;
   src_mask:= src_mask shl 1;
end;


 
Alex Konshin ©   (2008-08-19 11:52) [11]

Если маска фиксирована, то дарю идею:
Нужно создать несколько таблиц преобразования. Каждая таблица - по 256 байт. Вся операция сведётся к фиксированному количеству сдвигов, выборки из таблицы и or. Никаких циклов. Если делать на basm, так вообще будет быстро.

Если не фиксирована, но меняется редко, а операцию нужно делать часто, то таблицы можно генерить на лету.


 
oldman ©   (2008-08-19 11:58) [12]


> Dmitry S ©   (18.08.08 16:42) [9]
> Тут результат будет 10, а не 1.
> Результат обратной операции будет "10xx". где xx - два,
> не важно каких, бита :)


Поскольку (как я понял) если в маске 0, данные не рассматриваются, то
результатов обратной операции несколько:
10хх, 1х0х, 1хх0, х10х, х1х0, хх10

Выбирай...


 
Alex Konshin ©   (2008-08-19 12:04) [13]


> oldman ©   (19.08.08 11:58) [12]

Либо ты, либо я неверно поняли. В оригинальном примере показано выборка каждого третьего бита. Обратная операция однозначна, если все добаляемые биты нули. Так что я не вижу неоднозначности.
Подобные преобразования обычно делают либо аппаратно, либо таблицами.
Что я и предложил. То есть это не моя идея, это стандартный подход к таким задачам.
Всё-таки образование и опыт играют роль.


 
oldman ©   (2008-08-19 12:12) [14]


> Либо ты, либо я неверно поняли. В оригинальном примере показано
> выборка каждого третьего бита.


Тогда не 10хх, а 1хх0
:)))


 
oldman ©   (2008-08-19 12:35) [15]

если тупо выборка каждого третьего бита, на фига тогда маска вообще?
тогда данные обрабатываются легко и просто.



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

Форум: "Прочее";
Текущий архив: 2008.10.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.047 c
2-1220458117
Fok
2008-09-03 20:08
2008.10.12
Как удалить последний символ в строке?


15-1218900402
Andy BitOff
2008-08-16 19:26
2008.10.12
...примерно в сто тысяч раз большей скорости света


2-1220622285
Demo_nik
2008-09-05 17:44
2008.10.12
Как поределить путь к каталогу в котором нахожусь?


2-1220862432
Matveih1
2008-09-08 12:27
2008.10.12
Как передать используемое подключение к БД в подгружаемый модуль?


2-1220106974
Alral
2008-08-30 18:36
2008.10.12
Функция Recv и PChar





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