hur.cn - 华软网

 热门搜索

获取数据的第几位的方法

  作者:未知    来源:网络    更新时间:2010/12/8
我想猎取数据的第31位怎么猎取,以下的前往值(lParam),如果第31位为0则为按下。。那这个第31位怎么猎取?
键盘钩子:
LRESULT CALLBACK KeyboardProc(          int code,
    WPARAM wParam,
    LPARAM lParam
);
这里的lParam:
lParam
[in] Specifies the repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag. For more information about the lParam parameter, see Keystroke Message Flags. This parameter can be one or more of the following values. 
0-15
Specifies the repeat count. The value is the number of times the keystroke is repeated as a result of the user's holding down the key.
16-23
Specifies the scan code. The value depends on the OEM.
24
Specifies whether the key is an extended key, such as a function key or a key on the numeric keypad. The value is 1 if the key is an extended key; otherwise, it is 0.
25-28
Reserved.
29
Specifies the context code. The value is 1 if the ALT key is down; otherwise, it is 0.
30
Specifies the previous key state. The value is 1 if the key is down before the message is sent; it is 0 if the key is up.
31
Specifies the transition state. The value is 0 if the key is being pressed and 1 if it is being released.

---华软 网友回答---
if(lParam & 0x80000000)
---华软网友回复---
能解释下么?比如我要猎取第二位 第三位怎么操作?
另有我要猎取第0-15位怎么操作?

---华软网友回复---
&是与运算,十六进制0x80000000相当于二进制:1000 0000 0000 0000 0000 0000 0000 0000,也就是第31位为1,其余的为0。
如果你要取第二位的话,则&上,0000 0000 0000 0000 0000 0000 0000 0100
---华软网友回复---
第n位(0 <= n <= 31)
lParam & (1<<n)

m~n位 (0 <= m <= n <=31)
lParam & (((1<<(n-m+1))-1)<<m)

0~15位
lParam & ((1<<16)-1)

---华软网友回复---
从lParam取若干位的基本算法是:lParam & mask
关头是构造其中的mask,你想要的位都置1,其余位都是0

比如要4~7位,mask就是0xF0
通用的写法:lParam & (((1<<(n-m+1))-1)<<m)
首先((1<<(n-m+1)),结果在n-m+1这一位是1,其余位全都是0 --- 0x10
把它减去1之后,结果最低的0~(n-m)位全都是1,其余高位都是0 --- 0x0F
再左移m位,就把适才获得的1都移到了m~n位 --- 0xF0


---华软网友回复---
简单的移位操作。 看看c/c++的位操作运算符就好了。 无非是<< >> & |
---华软网友回复---
移位操作<<或>>,按位与&,或按位或|
---华软网友回复---
引用 3 楼 wltg2001 的回复:
&amp;是与运算,十六进制0x80000000相当于二进制:1000 0000 0000 0000 0000 0000 0000 0000,也就是第31位为1,其余的为0。
如果你要取第二位的话,则&amp;上,0000 0000 0000 0000 0000 0000 0000 0100

更正一下
&是位于,&&是于
wltg2001提供的是规范做法
比移位更简单直观一些
你看看windows的许多宏都是这么设计的
---华软网友回复---
按位于,或,位移
---华软网友回复---
引用 1 楼 wltg2001 的回复:
if(lParam &amp; 0x80000000)

Up...
---华软网友回复---
移位操作 然后按位与
---华软网友回复---
引用 8 楼 xianglitian 的回复:
引用 3 楼 wltg2001 的回复:
&amp;amp;是与运算,十六进制0x80000000相当于二进制:1000 0000 0000 0000 0000 0000 0000 0000,也就是第31位为1,其余的为0。
如果你要取第二位的话,则&amp;amp;上,0000 0000 0000 0000 0000 0000 0000 0100

更正一下
&amp;是位于,&amp……



 upup
---华软网友回复---
  class="deleted_message"> 该回复于2010-12-08 10:07:07被版主删除
---华软网友回复---
lParam & 0x80000000

按位与,要猎取第31位,让第31位为1,与的结果就是第31位,一样的如果你要猎取第0-15位
那就让0-15位都为1。其余位为0 。按位与的结果就是0-15位。
     
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。