- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
LABVIEW的深入探索之功能强大的位操作能力
LABVIEW作为面向具体应用的工程师的编程语言,由于经常需要操作硬件设备寄存器,而寄存器往往都是需要位操作的,因此LABVIEW具有位操作能力是必须的。LABVIEW不仅具有强大的位操作能力,而且操作极其方便,这得益于LABVIEW具有一般编程语言不具备的特殊数据类型--布尔量。
相信经常使用C51和PLC的朋友们都非常熟悉位操作,51单片机具有自己的位寻址区,位寻址区不但可以进行位寻址,也可以按字节、字(双字节)寻址,PLC也是如此。但是很多设备和编程语言是不支持位寻址的,只允许字节或者字的方式,高级编程语言基本如此。
我在下面的文章中大致提及了LABVIEW中的位操作,但是是针对具体问题的,本文希望系统性地讨论一下LABVIEW中的位操作极其特点。
http://www.jsuedc.cn/csxcs366/blog/08-08/153754_5fd57.html
C语言中的位操作符包括位非(按位取反)、位与、位或和异或四个基本操作符,LABVIEW提供了更多的位操作函数,这体现了LABVIEW语言的面向应用的特点,其实,具备了与、或、非三个基本操作符,其它位操作符都可以由与、或、非操作符组合而成。
LABVIEW提供了独特的布尔数据类型,但是布尔数据实际占用一个字节,也就是说,布尔数据虽然形式上类似于位,但是与位是完全不同的,LABVIEW利用一个字节表示布尔量,如果字节值为0,则表示布尔量为FALSE,如果值为1,则表示布尔量为TRUE。
LABVIEW专门提供布尔函数选板,包括了与、或、非等多种布尔操作函数,如下图所示:
LABVIEW中的布尔函数基本都是多态函数,具有两个非常重要的特点:
1、布尔函数支持布尔量的逻辑运算
2、支持U8、U16、U32等位运算
3、函数的输入端子必须为布尔值或数字。 可以是标量、数字或布尔值数组或簇、数字或布尔值簇数组等。
布尔量的基本逻辑运算非常简单,这里就不具体讨论了。对于多字节的位运算,比如U16、U32等,与U8的位操作非常类似,因此下面的讨论主要是针对U8数据的。
首先我们考虑一下为什么要针对U8而不是I8数据类型那,I8数据的最高位为符号位,因此I8主要是用来表示数值的大小的。我们采用U8进行位操作,U8数据每个位都表示一个布尔值(开关量),每个位的值只有0、1两种选择。U8数据可以表示8个位,不存在符号的问题,实际上我们对U8所代表的值并不关心,我们更关心的是每个位的值是0还是1。
下面我们开始讨论LABVIEW中常用的位操作。
一、掩码
由于高级语言不支持位寻址,所以针对字节或字中的某一位或者几位进行操作时,必须借助与掩码。掩码是某些位为0,某些位为1的位组合。对于字节的位操作,通常采用下列掩码(MASK)
BIT0----->(MASK) 0X01
BIT1----->(MASK) 0X02
BIT2----->(MASK)0X04
BIT3----->(MASK)0X08
BIT4----->(MASK)0X10
BIT5----->(MASK)0X20
BIT6----->(MASK)0X40
BIT7----->(MASK)0X80
一个字节有8位构成,分别定义为BIT0--->BIT7,每位的掩码是该位为1,其它为0的U8数。
二、如何求取掩码
我们列举了U8的8个掩码,如果是U64,则会有64个掩码,这种情况下采用列举的方法就很麻烦了。很明显,掩码是有规律的,从BIT0开始为1,依次递增2倍,因此可以用下列两种方法求取掩码。
1、计算法
2、移位法
我们知道,乘以2运算实际上就是移位运算,而且更为快捷,这是C语言中常用的方法。
三、置位(打开位)
对某一位置1,而其它位保持不变,这种操作称作置位(SET)操作,也称作打开位操作(OPEN).
如果需要某位置位,而其它位不变,与该位掩码进行按位或运算即可。下面的例子对BIT3进行置位操作。 [p]
除了使用基本的位操作函数外,LV中还可以使用另外一种独特的方法进行位操作,这是其它编程语言不具备的。我们知道LABVIEW中的布尔数据类型与位非常类似,不过是存储空间不同。LABVIEW中的布尔数组和按字节、字进行位操作极为类似。因此可以先把字节、字转换为布尔数组,进行相应的位操作后在转换回字节、字。如下图所示,实现的是置位操作,与上图效果相同。
布尔数组可以直接转换成U32,因此使用上述方法操作双字更为方便,由于中间经过了多次转换,可能运行效率会低于直接使用位操作。在下面的其它位操作中,将同时演示两种不同的方法。
四、复位(关闭位)
复位操作与置位操作相反,复位操作使某个位的值恢复为0状态,这是默认状态,因此称作复位。
对掩码按位取反,则只有一位为0,其它位均为1,与字节进行与操作,则只有一位复位为0,其它位保持不变。
五、转置位
转置位就是对掩码指定的位进行反转,如果原来为0,则置位为1。如果原来位1,则复位为0。进行转置位操作,最简单的就是进行异或操作。
假如我们还是对BIT3 (掩码0X08)进行操作。由于掩码中的BIT3为1,如果字节中的BIT3为0,异或的结果是不同为1,字节中的BIT3由0成了1。反之,如果字节中的BIT3为1,异或的结果是相同为0,因此BIT3由1变成了0,实现了该位的转置。
由于掩码的其它位为0,根据相同为0,不同为1的原则,其它位会保持不变。
六、查看某位的值
查看某位的值就非常简单了,只要字节与掩码进行与操作,判断结果是否为0就可以了。如果字节该位为1,与掩码与的结果则不为0。反之,如果字节的该位为0,与掩码与的结果则为0。
除了了对字节中的某一位进行置位、复位、转置和测试位的能力,LABVIEW还支持对无符号数、有符号数的移位操作,这在高级编程语言中是不多见的,充分体现了LABVIEW面向工程应用的特点。