AU3中BitAnd与Win32汇编中的&按位进行与操作的本质思考
心越静,思考的越透彻。不要着急,宇宙有求必应!我可能是最笨的才会写出来进行思考,写出来至少自己在碰到这些本质上的问题不会再度卡壳。本着"没有交流的思考不是完整的思考"的原则,我将这篇文章发出来,如果能引发出你的共鸣,那么请像我一样。期待与你的交流!
在AU3论坛中找到了篇帖子为这个问题作为参考:
白痴问个比较白痴的问题:在实际中我到底怎么样才会用到BitOR,BitAND,BitXOR?
AU3中的BitAnd、BitOr、BitNot、BitXor、And、Or、Not;分别对应汇编中的And、Or、Not、Xor、&&、||、!;两者中的前四个指令,多用于两个操作数之间的逻辑操作,并且保存结果到变量或者源操作数中。两者中的后三个指令,多用于表达式中的逻辑操作。&&、||都会被翻译成与自身相或,来判断是否等于0.所以结果不会变只会影响相应的标志位。如ZF,程序也正是用ZF标志位来判断是否转跳。
总是觉得逻辑上过得去,但是总觉得缺少了点背景资料(为什么会有这个东西存在,它的历史是什么呢,背后的思想又是什么呢?);既然这类操作多用于组合标志位,那么不妨以此来作为思考的切入点。
一个Flg初始化为0000000000000(32个0),那么每一个都是一个"Flg",0和1表示(开或者关)。(这句话的意思是让你把思维切换到二进制来思考这个问题)
纵观整个AU3帮助文档,所有涉及组合标志位的函数如:FileOpen,WinGetState等函数(有兴趣的可以查看一下windowsconst.au3)的组合标志位都是1、2、4、8、16...发现了什么?它们与二进制每位的权值一一对应。
引申出另一个问题:为什么没有用3、5、7、9..这些常数作为组合标志位的值呢?对照一下上下的区别是:没错,上文是除了1都是偶数,下文是奇数。所以这个问题的答案可以说:用上文的所有偶数构造出最接近下文的偶数,然后+1就可以了。所以一个二进制的Flg组合标志位,十进制表示为奇数,那么这个二进制位的第0位必然是1.
从另一个角度讲,这样的组合标志位原则有利于逻辑运算;比如9 and 8,二进制位分别为1001与1000,除了8所代表的二进制第三个标志位其他位全部为0。根据与运算的规则,结果肯定不为零所以成真。
又例如一个实际的例子:
1 = 窗口存在
2 = 窗口可见
4 = 窗口可用(未被禁用)
8 = 窗口为激活状态
16 = 窗口为最小化状态
32 = 窗口为最大化状态
你想要判断这个窗口是不是最小化,就用:
$win_state=WinGetState("***","****")
If BitAND($win_state,8)==8 Then ***********
如果窗口的状态为1、2、4,那么二进制为0001,0010,0100.可见8d所代表的第三位都是0,所以If BitAND($win_state,8)==8肯定是不成立的。
如果为16和32呢?那么二进制为10000,100000。可见8d所代表的第三为都是0,所以If BitAND($win_state,8)==8肯定是不成立的。
只有16 < 窗口状态 > 8 的情况下,If BitAND($win_state,8)==8 Then ***********才会成立。因为这时候无论要表示9~15中的任意一个数都要用到8(二进制的第三位为1),但大于15就进位了。
从这个意义上讲,窗口的状态总是向下包含的;可以看到8(窗口为激活状态),绝对包含,1、2、4这些属性位。因为“窗口为激活状态”,那么不可能不存在这些状态“窗口存在”, “ 窗口可见 ”,“窗口可用(未被禁用) ”,但二进制表示为8的时候,又有了一个新的意义那就是“窗口为激活状态”。同理没有“窗口最大化”的概念,哪里来的“窗口最小化”这个概念呢?没有“窗口最小化”这个概念,哪里来的“窗口为激活状态”这个概念呢?无论从数学的意义上,还是从函数说明上来理解这个概念都是行得通的。
继续往下思考,可以发现有些标志位的组合都有类似这样的说明“此标志必须与XX标志共同使用”或者“此标志不能与XX标志共同使用”;例如OPENFILENAME这个结构中,OFN_FILEMUSTEXIST和OFN_PATHMUSTEXIST必须共同使用,那么这两个常量的取值是多少呢?分别是1000h和800h;
总结:
先把视角切换到二进制位的32位Flg,帮助文档上缩写的十进制1、2、4、8,说白了只是标志位组合中的相应位是否为1而已。(为了适应人类的长了十根手指而产生的思考局限)
再说的透彻点,这个组合标志位所代表的十进制,或者十六进制的数值是没有意义的,从二进制的角度来讲它也只代表32个按钮的开关状态而已。
强制开启开关可以使用or 开关组状态1和索引(我觉得这样理解更透彻),如果要检测一个开关是否被开启可以使用and 开关组 索引和状态1。
如果把组合标志位想像成开关,1代表开,0代表关。将BitAnd(32个开关,000000000001000)1代表我要开其中的一个开关。如果这个开关之前是关着的,那么 1 and 0 = 0 。
如果这个开关之前是开着的,那么1 and 1 = 1。可见and指令是返回之前开关的状态...
按照这个思路的话,如果我要关一个开关,这个开关之前是关着的,0 and 0 = 0 反之 0 and 1 == 0,“and指令是返回之前开关的状态”在这里又不适用了。(待抽象与泛化,世间总有相同的规律的。)
AU3中BitAnd与Win32汇编中的&按位进行与操作的本质思考的更多相关文章
- 汇编中Enter与Leave指令
Enter的作用相当==push ebp和mov ebp,esp 这后面两句大家很熟悉吧?函数开始一般都是这两句 Leave的作用相当==mov esp,ebp和pop ebp 而这后面这两句也很常见 ...
- 罗云彬win32汇编教程笔记 子函数的声明, 定义与调用
在主程序中用call指令来调用子程序. Win32汇编中的子程序也采用堆栈来传递参数,这样就可以用invoke伪指令来进行调用和语法检查工作. 一. 子程序的定义 子程序的定义方式如下所示. 子程序名 ...
- win32 Dll 中添加afx.h 出现如下错误 error LNK2005: _DllMain@12 already defined
win32 Dll 中添加afx.h 出现如下错误 nafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in ...
- Win32工程中使用MFCdll的解决方法
我的项目是Win32,先使用了 Standard Windows Libraries,可后期又要要使用MFC的dll,所以要更改工程属性 ,MFC 的dll可以使用了,但标准的windows的dll出 ...
- ARM汇编中的标号
标号(LABEL)是为一组机器指令所起名字,表示程序中的指令或者数据地址的符号.标号可有可无,只有当需要用符号地址来访问该语句时,才给此语句赋予标号.通过在目标地址的前面放上一个标号,可以在指令中使用 ...
- WIN32 DLL中使用MFC
最近用WIN32 DLL,为了方便要用到MFC的一些库,又不想转工程,就网上找了很多方法,发现没有详细的介绍,有的也行不通,现在成功在WIN32 DLL中使用了MFC,记录一下以防以后用到忘记 一.修 ...
- 为什么X86汇编中的mov指令不支持内存到内存的寻址?
在X86汇编中,MOV [0012H], [0016H]这种指令是不允许的,至少得有一个操作数是寄存器.当然,这种问题在用高级语言的时候看不到,感觉好像基本上都是从内存到内存啊,为毛到了汇编就不行了? ...
- 汇编中PTR常见的几种用法
汇编中PTR的用法确实是令人比较头疼的,我特意搜集了一些PTR的应用实例,可以从例子中揣摩出规律: 1.MOV WORD PTR [DI],OFFSET BUF1 2.SUB BYTE ...
- 在WIN32 DLL中使用MFC
最近用WIN32 DLL,为了方便要用到MFC的一些库,又不想转工程,就网上找了很多方法,发现没有详细的介绍,有的也行不通,现在成功在WIN32 DLL中使用了MFC,记录一下以防以后用到忘记 一.修 ...
随机推荐
- HTML5 <template>
http://www.zhangxinxu.com/wordpress/2014/07/hello-html5-template-tag/
- Codeforces Round #407 (Div. 1) B. Weird journey —— dfs + 图
题目链接:http://codeforces.com/problemset/problem/788/B B. Weird journey time limit per test 2 seconds m ...
- Js中获取显示器、浏览器以及窗口等的宽度与高度的方法
网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽:document.body.offsetWid ...
- codeforces C. Ilya and Matrix 解题报告
题目链接:http://codeforces.com/problemset/problem/313/C 题目意思:给定 4n 个整数(可以组成 2n × 2n 大小的矩阵),问通过对这些整数进行排列, ...
- AndroidManifest配置之uses-sdk
uses-sdk配置 uses-sdk用来设置app对android系统的兼容性.它包含三个可选的配置项,分别为android:minSdkVersion,android:targetSdkVersi ...
- [原创]Java开发如何在线打开Word文件
此方案使用了PageOffice产品实现在线打开Word文档: 1. 首先从PageOffice官网下载产品开发包,http://www.zhuozhengsoft.com/dowm/ ,下载Page ...
- python 基础之第十天(闭包,装饰器,生成器,tarfile与hashlib模块使用)
局部变量与全局变量 局部变量:在函数里面定义的,只有当函数活动时才生效 全局变量:不在函数里面的 In [1]: x=10 In [2]: def bar(): ...: x=20 ...: prin ...
- 使用Rest api管理Ceph网关
背景 开发基于Ceph RadosGW的微服务,需要实现调用方可以通过rest api就能创建用户,获取用户信息等功能. 实现 Ceph的RadosGW自身就有该功能,这些创建用户.获取用户信息.获取 ...
- g2o扩展,然后重新编译生成新库。
orb作者有g2o扩展,g2o原作者也有g2o扩展,等各项基本功扎实以后,考虑把他们整合在一起,再加上高博扩展的g2o,统一cmake,make,然后能make install 正常使用,就最好了.
- 菜鸟-@responsebody 理解-用法
@responsebody表示该方法的返回结果直接写入HTTP response body中一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,加上@respo ...