#c #winapi #windows-messages #bit-shift
#c #winapi #windows-сообщения #сдвиг в битах
Вопрос:
Мне нужно получить 30-й бит параметра lParam, переданный с сообщением WM_KEYDOWN. Этот бит, как написано здесь, позволяет мне узнать, была ли клавиша нажата ранее. Подходит ли этот код для его получения?
(lParam >> 30) amp; 1
Комментарии:
1. Просто придираюсь, но
(lParam >> 30) amp; 1
проверяет, установлен ли 31-й бит.
Ответ №1:
Я бы просто использовал lParam amp; 0x40000000
. Если это значение не равно нулю, значит, b30
было установлено (кстати, я считаю, что это тридцать первый бит из тридцати двух). И больше вероятности, что это будет {logical-and, compare}
операция, а не {shift, logical-and, compare}
.
Имейте в виду, есть хороший шанс, что приличный компилятор в любом случае сгенерирует более эффективный код, даже если вы использовали (lParam >> 30) amp; 1
но зачем рисковать?
Комментарии:
1. @paxdiablo ты уверен насчет этого? Я получаю странное поведение с вашим кодом. Я должен проверить и присвоить логической переменной значение true, только если ключ был выпущен до отправки сообщения. Для этого я должен проверить, равен ли 30-й бит 1 (клавиша нажата до отправки сообщения)
2. @Frerich, на самом деле это 15-й бит, но я понимаю, к чему ты клонишь — глупая ошибка с моей стороны, которую я сейчас исправил.
3. @Stefano,
b30
это 31-й бит, потому что биты варьируются отb0
(первого) доb31
(тридцать второго). Это всего лишь небольшая разница в именовании, потому что, несмотря на то, в чем вас будут пытаться убедить технические специалисты, first по-прежнему означает first 🙂0x400000000
является двоичным0100 0000 0000 0000 0000 0000 0000 0000
, что и является маской, которую вы ищете. Размещенная вами ссылка использует позиции битов (0-31), а неfirst
черезthirty-second
.4. @paxdiablo: Я бы хотел отозвать свой голос понижения теперь, когда вы исправили ответ, но, похоже, мой голос «заблокирован» до тех пор, пока ответ не будет отредактирован. :-/
5. @Frerich, я обычно делаю «фантомную» правку, когда хочу это сделать (что-то, что не меняет сути ответа, но все же обходит «рекомендации» SO). Вы должны быть в состоянии сделать это сейчас, если хотите. Или, серьезно, вы можете просто не беспокоиться об этом. 2 повторных пункта не изменят мою жизнь 🙂 и я позже голосую за мой улучшенный ответ, обычно эффект в любом случае обратный. Так что никаких обид, если у вас не найдется на это времени.