LABVIEW的深入探索之功能强大的位操作能力
LABVIEW作为面向具体应用的工程师的编程语言,由于经常需要操作硬件设备寄存器,而寄存器往往都是需要位操作的,因此LABVIEW具有位操作能力是必须的。LABVIEW不仅具有强大的位操作能力,而且操作极其方便,这得益于LABVIEW具有一般编程语言不具备的特殊数据类型--布尔量。
本文引用地址:https://www.eepw.com.cn/article/201701/337243.htm相信经常使用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进行置位操作。
评论