| 
| 
 | Вопрос # 3 049/ вопрос решён / | 
 |  Здравствуйте, эксперты!
 Есть кусок кода.
 Которым пользуюсь но не догоняю как и почему работает?
 Если можно прошу обьяснить как нибудь попонятней
 
|  |   Вопрос задал: 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) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |