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,记录一下以防以后用到忘记 一.修 ...
随机推荐
- codeforces B. Ilya and Queries 解题报告
题目链接:http://codeforces.com/problemset/problem/313/B 题目意思:给出一个只有 "." 和 "#" 组成的序 ...
- Mac开发快速入门
初次接触mac开发,发现国内相关资料少得可怜,于是写下这篇文章,作为学习记录.Mac应用开发也是使用Objective-C进行开发的,所以从iOS转Mac并不困难,很多东西都一样. 本文以一个登录界面 ...
- EDM文件编写规范及注意事项
[设计EDM邮件] (1)乱码:你没法知道所有用户的系统环境,因此使用utf8来避免乱码是非常重要的 (2)绝对URL:若是相对URL,用户在打开页面是将看不到图片 (3)图片Alt属性:大多数邮件服 ...
- hdu-2647 Reward && hdu-2049产生冠军 &&hdu-3342Legal or Not(拓扑排序)
题目链接: hdu-2647 /*Problem : 2647 ( Reward ) Judge Status : Accepted RunId : 16919085 Language : G++ A ...
- 机器学习 : 高斯混合模型及EM算法
Mixtures of Gaussian 这一讲,我们讨论利用EM (Expectation-Maximization)做概率密度的估计.假设我们有一组训练样本x(1),x(2),...x(m),因为 ...
- HihoCoder 1473 : 小Ho的强迫症( 欧几里得 )
描述 小Ho在一条笔直的街道上散步.街道上铺着长度为L的石板,所以每隔L距离就有一条石板连接的缝隙,如下图所示. 小Ho在散步的时候有奇怪的强迫症,他不希望脚踩在石板的缝隙上.(如果小Ho一只脚的脚尖 ...
- No result defined for action cn.crm.action.LinkManAction and result input
这是struts2的一个拦截器报的错误,当你的form中的数据有问题,比如说<input type="text" name="receiverLoginID&quo ...
- HTTP Status 500 - Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
如果在service类上面没有添加注解,出现异常 @Transactional
- C++之面向对象初探----对象管理模型(关键是this指针)
前言 c++对象模型可以概括为以下2部分 1.语言中直接支持面向对象程序员设计部分,主要涉及如构造函数.析构函数.虚函数.继承(单继承.多继承.虚继承).多态等待. 2.对于各种支持的底层实现机制 在 ...
- 【linux+C】神器 vim + 指针相关客串
前篇回顾 上篇介绍了linux下C编程基本环境配置以及相关工具使用选择. 不过10个大牛9个用vim,那么咱们就来玩vim.linux下玩c就别依靠图形界面.好吧告别Ide,命令行才是c的王道. 本篇 ...