ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 为什么某些情况需要使用“按位”运算符而不是“逻辑”/“相等”运算符?

2019-07-23 09:06:52  阅读:344  来源: 互联网

标签:c bitwise-operators event-handling boolean-logic sdl


前几天我试图使用SDL多媒体库编写一个小的C编程,我遇到了这个小麻烦,我最终通过反复试验解决了这个问题.问题是,我理解我为解决问题所做的工作,但我并不了解问题的本质!

问题在于SDL中的键盘事件处理.处理单键按下以退出程序的代码是直截了当且简单的. [eventQueue是一个SDL_Event结构]

//checks for keypress events..
if ( eventQueue.type == SDL_KEYDOWN )
{ 
    //note: uses the boolean logical '==' equals operator..
    if ( eventQueue.key.keysym.sym == SDLK_ESCAPE )
    {
        running = false;
    }
}

在上面的代码中,只需按下ESCAPE键就可以结束主循环并导致程序清理和关闭……

但是…处理使用修饰键(shift / alt / ctrl)的按键所需的代码与’==’运算符无法正常工作.我花了很长时间才发现我需要使用按位AND运算符而不是相等(逻辑?)运算符.

//checks for keypress events..
if ( eventQueue.type == SDL_KEYDOWN )
{ 
    //note: requires the use of the bitwise AND operator..
    if (( eventQueue.key.keysym.mod & KMOD_ALT ) && (eventQueue.key.keysym.sym == SDLK_F4 ))
    {
        running = false;
    }
}

我的困惑来自这样一个事实:当使用’keysym.sym’成员时,逻辑运算符’==’工作正常,但是,当使用’keysym.mod’成员时,有必要使用’&; “按位AND运算符.

现在,如果我不得不猜测,我会说它与’keysym.sym’只需要处理代表键盘上单个键的单个数值这一事实有关,而’keysym.mod’有处理shift,ctrl和alt键的各种组合……?

总结一下我的问题:为什么会这样?除了试验和错误之外,还有什么需要学习某个数据是否需要与按位或逻辑/相等运算符进行比较?为什么“keysym.sym == SDLK_F4”工作正常,但“keysym.mod == KMOD_ALT”没有?为什么涉及十进制数的操作与比较位值的操作有不同的结果?是否还存在逻辑运算工作和按位运算不起作用的情况?

解决方法:

按位AND有点特殊. ==检查是否相等,但按位AND运算符允许您使用数字的各个位.

想象一下,您的事件被定义为键列表:

event = ['a', 'shift', 'ctrl']

然后,您可以非常轻松地检查特定修改器是否是事件的一部分:

if 'shift' in event:
  # ...

按位AND有点像in语句.您可以将事件定义为二进制数,如下所示:

event = 00010010

现在,当您执行按位AND时,您可以轻松检查是否已将某个修改器应用于事件,因为修饰符也表示为二进制数:

  00010001  # event (18)
& 00010000  # shift key (8)
----------
  00010000  # you get a non-zero answer, so the shift key is in the event
----------

  00010001  # event (18)
& 00001000  # "z" key (4)
----------
  00000000  # you get zero because the "z" key wasn't a part of the event
----------

您可以使用按位OR构造这样的事件:

  00000001  # shift key (1)
| 10100000  # "a" key (160)
----------
  10100001  # resulting event (161)
----------

维基百科很好地总结了bitwise operations

A bitwise operation operates on one or more bit patterns or binary numerals at the level of their individual bits. It is a fast, primitive action directly supported by the processor, and is used to manipulate values for comparisons and calculations. On simple low-cost processors, typically, bitwise operations are substantially faster than division, several times faster than multiplication, and sometimes significantly faster than addition. While modern processors usually perform addition and multiplication just as fast as bitwise operations due to their longer instruction pipelines and other architectural design choices, bitwise operations do commonly use less power/performance because of the reduced use of resources.

基本上,按位运算符允许您有效地处理存储在整数位中的信息.

标签:c,bitwise-operators,event-handling,boolean-logic,sdl
来源: https://codeday.me/bug/20190723/1512095.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有