Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 049

/ вопрос решён /

Здравствуйте, эксперты!

Есть кусок кода.
Которым пользуюсь но не догоняю как и почему работает?
Если можно прошу обьяснить как нибудь попонятней

Приложение:
  1. ...
  2.  
  3.  
  4. if ((LParam or (1 shl 30))=LParam) then
  5.  
  6.  
  7.  


Anderson N.N Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Anderson N.N (статус: 2-ой класс)
Вопрос отправлен: 30 июля 2009, 12:14
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Anderson N.N!
(1 shl 30) - даст бит 1 в 30 бите. остальные нолики (01000000000000000000000000, если не смазал кол-во нулей)
or меняет на единицу только там биты, где 1, где 0 - не трогает. таким образом LParam or (1 shl 30) гарантировано выставит в 1 30-тый бит. и не тронет другой. and же не трогает биты. где в маске 1, и занулит там, где ноль
теперь мы имеем переменную, в которой гарантировано выставлен проверямый бит. и мы сравниваем с оригиналом. Понятно, что если бит был выставлен, то сравнение пройдет удачно. и наоборот.
Я такую конструкцию обычно не использую - пишу короче
LParam and (1 shl 30) > 0

P.S. or/and/xor это не только операции логического или/и/искл.или, а и работы с битами - это ключевой момент.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 30 июля 2009, 12:55
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: min@y™

Всё правильно.
Если бы 30-й бит LParam был бы = 0, то не выполнилось бы условие ((LParam or (1 shl 30))=LParam).
Если тебя это сущает, перепиши по-другому:

if LParam and (1 shl 30) <> 0 
  then...

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 30 июля 2009, 13:00
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 0.

31 января 2011, 19:36: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 3 декабря 2021, 13:43
Выполнено за 0.02 сек.
Рейтинг@Mail.ru