C++ 在WM_KEYDOWN消息中获取lParam参数的第30位

C++ 在WM_KEYDOWN消息中获取lParam参数的第30位,c++,winapi,windows-messages,bit-shift,C++,Winapi,Windows Messages,Bit Shift,我需要将lParam参数的第30位与WM_KEYDOWN消息一起传递。这段文字让我知道之前是否按过键。这个代码正确吗 (lParam >> 30) & 1 我只需要使用lParam&0x40000000。如果是非零,则设置 B30(顺便说一下,我认为三十二位的第三十一位)。更可能是一个{logical And,compare}操作,而不是{shift,logical And,compare} 请注意,即使您使用了(lParam>>30)&1,一个好的编译器也很有可能生成效率

我需要将lParam参数的第30位与WM_KEYDOWN消息一起传递。这段文字让我知道之前是否按过键。这个代码正确吗

(lParam >> 30) & 1

我只需要使用
lParam&0x40000000
。如果是非零,则设置<代码> B30(顺便说一下,我认为三十二位的第三十一位)。更可能是一个
{logical And,compare}
操作,而不是
{shift,logical And,compare}


请注意,即使您使用了
(lParam>>30)&1
,一个好的编译器也很有可能生成效率更高的代码,但为什么要冒险呢?

只是吹毛求疵,但是
(lParam>>30)&1
会测试是否设置了第31位。@paxdiablo您确定这一点吗?我发现你的代码有点奇怪。我应该检查布尔变量并将其设置为true,前提是在发送消息之前已释放密钥。要做到这一点,我应该检查第30位是否为1(在消息发送之前键已关闭)@Frerich,实际上是第15位,但我知道你是从哪里来的-我犯了一个愚蠢的错误,我现在已经纠正了。@Stefano,
b30
是第31位,因为位的范围从
b0
(第一位)到
b31
(第三十二位)。这只是命名上的一个细微差别,因为尽管技术负责人会试图说服你,第一仍然意味着第一:-)
0x400000000
是二进制的
01000000
,这是你正在寻找的掩码。您发布的链接使用位位置(0-31),而不是
第一位
第三十二位
@paxdiablo:我想撤销我的否决票,因为您已修复了答案,但在编辑答案之前,我的投票似乎“锁定”:-/@Frerich,当我想做的时候,我通常会做一个“幻影”编辑(这不会改变答案的本质,但仍然可以绕过SO的“指导原则”)。如果你愿意的话,现在应该可以做了。或者,说真的,你可以不用担心。2个代表分数不会改变我的生活:-)我后来投票决定我的改进答案通常会逆转这种效果。所以,如果你不去做,就不会有不愉快的感觉。