【问题标题】:How do I get the high- and low-order bits of a SHORT?如何获得 SHORT 的高位和低位?
【发布时间】:2011-07-15 05:15:33
【问题描述】:

函数GetKeyState() 返回一个包含键状态的SHORT(高位向上/向下,低位切换)。我如何获得这些值?

【问题讨论】:

    标签: c++ winapi short


    【解决方案1】:

    简单的位操作就可以了。 SHORT 是 16 位整数,因此要获取低位和高位,您可以执行以下操作:

    lowBit = value & 1;
    highBit = ((unsigned short) value) >> 15;
    

    另外,请注意,LOBYTE 和 HIBYTE 宏用于将 SHORT 分解为低位和高位字节,而不是测试字节中的各个位。

    【讨论】:

    • 0x8000 进行 AND 而非位移更为常见。
    【解决方案2】:

    这不是您使用 GetKeyState() 的返回值的方式。改为这样做:

    SHORT state = GetKeyState(VK_INSERT);
    bool down = state < 0;
    bool toggle = (state & 1) != 0;
    

    【讨论】:

    • 谢谢 hans,但那只是一个例子,我只是想知道如何获得短片的低位和高位
    • value & 0xff* 你想要的是按位,而不是逻辑
    【解决方案3】:

    检查GetKeyStateGetAsyncKeyState 的结果的正常方法是按位与0x8000(二进制1000 0000 0000 0000)。

    #define IS_DOWN( GetKeyState(x) & 0x8000 )
    if( IS_DOWN( VK_ESCAPE ) ) // escape is down.
    

    【讨论】:

      【解决方案4】:
      #define LOBYTE(a) ((CHAR)(a))
      #define HIBYTE(a) ((CHAR)(((WORD)(a) >> 8) & 0xFF))
      

      【讨论】:

      • 你的意思是 LOSHORT 和 HISHORT 而不是 LOBYTE 和 HIBYTE 因为这两个已经在 'Windows.h' 中定义了
      • 我认为 Dylan 正在寻找的是 ChrisV 的答案,因为 GetKeyState() 文档指出“如果高位为 1,则密钥向下;否则,向上。”。对我来说,这意味着“最重要的一点”。 Dylan,基本上 LOSHORT/HISHORT 宏和 GetKeyState() 的移位/屏蔽是两个不同的东西。
      【解决方案5】:

      如果 Google 在尝试查找 GetKeyboardState() 而不是 GetKeyState() 的信息时像我一样将您带到这里,请注意它作用于 BYTE 数组,而不是 SHORT。

      • 如果选择按位AND,则应使用0x80,而不是0x8000
      • 如果换班,请使用&gt;&gt; 7,而不是&gt;&gt; 15

      例如,要确定是否有任何一个 CTRL 键按下:

      BYTE keyboardState[256];
      GetKeyboardState(keyboardState);
      if (keyboardState[VK_CONTROL] & 0x80)
      {
          std::cout << "control key!" << std::endl;
      }
      

      【讨论】:

        【解决方案6】:

        WORD == SHORT,HIWORD 适用于 DWORD,HIBYTE 适用于 SHORT/WORD。

        【讨论】:

        • 字!= 简短。 WORD == 无符号 SHORT。对于初学者来说,没有理由假设 HIBYTE(已记录为接受 WORD)也会接受其他类型。即使参数不是,结果是否仍然是无符号的也不清楚。
        • 我想这并不重要,因为 OP 对字节不感兴趣......但我认为知道 WORD == SHORT 总比不知道两者之间的关系要好 :)
        【解决方案7】:

        GetKeyState 当前返回SHORT 数据类型,该类型定义来自shortshort 位于–32,768 to 32,767 范围内。检测最高启用位(键已关闭)的一种方法是使其无符号,然后查询0x8000 const 值。

        另一种方法是将值保持为有符号并简单地将其与 0 进行比较。

        bool bIsKeyDown = GetKeyState(VK_SHIFT) < 0;
        

        就像这里提到的:https://stackoverflow.com/a/5789914/2338477

        所有负值都启用最高位,因为所有正值和零都禁用最高位。

        这是char的示例表,但同样适用于短数据类型,只是表会稍大。

        bits  value
        0000    0
        0001    1
        0010    2
        0011    3
        0100    4
        0101    5
        0110    6
        0111    7
        1000   -8
        1001   -7
        1010   -6
        1011   -5
        1100   -4
        1101   -3
        1110   -2
        1111   -1
        

        可以使用正常的“和”操作来检查按键切换,就像这里其他答案提到的那样:

        bool bIsKeyToggled = GetKeyState(VK_SHIFT) & 1;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-11-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-18
          • 2020-09-07
          • 2019-08-24
          • 1970-01-01
          相关资源
          最近更新 更多