Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Двоичное вычитание числа из объединения чисел 
:(
    Опции темы
Ciber SLasH
Дата 25.3.2006, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: нет
Всего: 67



Что-то я никак не въеду как вычесть число из объединения чисел?
К примеру, воьзьмём двоичные числа. Есть 2 числа:
1) 1100
2) 0110
объединяем эти два числа: 1100 or 0110 = 1110
как теперь из результат исключитьпервое число, чтобы осталось второе? При условии, что объединение может включать различные комбинации чисел, т.е. может быть: 1100 or 0110 or 1000 ... or xxxx и нужно при некотором условии или добавить число в объединение или исключить, но чтобы другие числа можно было бы проверить (результат and число == число).
PM   Вверх
sdeniss
Дата 26.3.2006, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 3.3.2006

Репутация: нет
Всего: 1



xor 2 число не подойдет?
a or b xor b = a or 0 = a

PM MAIL   Вверх
Ciber SLasH
Дата 26.3.2006, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: нет
Всего: 67



Цитата(sdeniss @ 26.3.2006, 10:26 Найти цитируемый пост)
xor 2 число не подойдет?

Не получится так.
Вот смотри: 1100 or 0110 = 1110
Теперь xor-им результат на первое число: 1110 xor 1100 = 0010 (не равно второму числу)
Не получается xor-ом получить второе число из результата.

Это сообщение отредактировал(а) Ciber SLasH - 26.3.2006, 17:24
PM   Вверх
cardinal
Дата 26.3.2006, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 5
Всего: 99



Цитата(Ciber SLasH @ 25.3.2006, 09:17 Найти цитируемый пост)
Что-то я никак не въеду как вычесть число из объединения чисел?

А почему объединение это or?


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
DENNN
Дата 26.3.2006, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



Цитата(Ciber SLasH @ 25.3.2006, 11:17 Найти цитируемый пост)
объединяем эти два числа: 1100 or 0110 = 1110
как теперь из результат исключитьпервое число, чтобы осталось второе?

Никак. После логического ИЛИ вобщем случае это невозможно (в отличие от XOR).
PM ICQ   Вверх
Бегемот
Дата 26.3.2006, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 26.1.2005
Где: На границе Европы и Азии

Репутация: нет
Всего: 3



Ciber SLasH, ну, а если ничего не вычислять, а просто сохранить нужные значения до того как произведёшь объединение?! А в случае ЧАВО - восстановить попорченное число!
PM MAIL   Вверх
nworm
Дата 26.3.2006, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 502
Регистрация: 22.10.2005

Репутация: 4
Всего: 8



Цитата

Никак. После логического ИЛИ вобщем случае это невозможно (в отличие от XOR).


Да, нельзя. Но кое-что восстановить можно.
Это ясно сразу из определения "or":

X Y | Z = X or Y
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 1

Тогда

Y Z | X = f(Y,Z)
0 0 | 0
0 1 | 1
1 0 | невозможно
1 1 | 0 или 1
PM MAIL WWW   Вверх
Ciber SLasH
Дата 27.3.2006, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: нет
Всего: 67



Вобщем я всё это спрашивал для того чтобы понять как исключается стиль из функции GetWindowLong.

Вот есть к примеру окно (с хэндлом Wnd), узнаём его стили:
Код
Style := GetWindowLong(Wnd, GWL_STYLE);

Чтобы исключить из этого окна какой-то стиль (к примеру WS_CAPTION), мы делаем следущее:
Код
SetWindowLong(Wnd, GWL_STYLE, Style and not WS_CAPTION);

А как работает алгоритм исключения не понятно? Ведь функция GetWindowLong возвращает 16-битное число, в котором определённые биты отвечают за стиль окна.

Это сообщение отредактировал(а) Ciber SLasH - 27.3.2006, 13:21
PM   Вверх
cardinal
Дата 27.3.2006, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 5
Всего: 99



and not в данном случае обнуляет 1 в 16-битно числе в нужном месте и все... Или я ошибаюсь?


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Ciber SLasH
Дата 27.3.2006, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: нет
Всего: 67



Цитата(cardinal @ 27.3.2006, 14:10 Найти цитируемый пост)
and not в данном случае обнуляет

Верно.
Короче я понял алгоритм этой функции. Вся соль в том, что каждый бит этого слова отвечает за определённый стиль окна. И поэтому ничего исключать здесь не надо, — надо всего лишь обнулить бит.

Тогда мне бы подошло множество. Из множества можно исключать значения. Но к сожаления в Delphi нельзя определить такое множество: var MN: set of Integer;
PM   Вверх
nworm
Дата 27.3.2006, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 502
Регистрация: 22.10.2005

Репутация: 4
Всего: 8



А какая цель-то всего этого? Чем не устраивает имеющийся способ?
PM MAIL WWW   Вверх
Ciber SLasH
Дата 27.3.2006, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: нет
Всего: 67



Цитата(nworm @ 27.3.2006, 16:05 Найти цитируемый пост)
А какая цель-то всего этого?

К примеру отлов нажатий клавиш. Когда срабатывает hook, то нужно проверить, нужно ли блокировать эту клавишу или нет. И ещё есть функция, которая добавляет/исключает ту или иную клавишу из наблюдения.

Я сначала хотел описать множество, в которое бы добавлялась нужная клавиша, если надо её отловить или удалялась эта клавиша, если не надо её отлавливать.
К примеру:
Код

var
  MN: set of Integer;
begin
  include(MN, VK_INSERT);  // отлавливать Insert
  include(MN, VK_CAPITAL);  // отлавливать CapsLock
end.

есть также процедура, которая исключает/добавляет клавишу:
Код

procedure IgnoreKey(isIgnore: Boolean; Key: Integer);
begin
  if isIgnore then exclude(MN, Key)
  else include(MN, Key)
end;

и есть процедура отлова клавиш, которая проверяет клавишу на вхождение в множество:
Код

if sReturn^.wParam in MN then
begin
  // клавиша входит в множество, значит её нужно блокировать
end
else
  // блокировать не нужно

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0926 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.