微波EDA网,见证研发工程师的成长!
首页 > 测试测量 > 测试测量技术文库 > LABVIEW的深入探索之功能强大的位操作能力

LABVIEW的深入探索之功能强大的位操作能力

时间:01-09 来源:互联网 点击:
学习过C语言的朋友们都知道,每当我们谈起C语言的优势时,强大的位操作能力是不能不提的,正是因为C语言具有强大的位操作能力,使得C语言广泛用于开发操作系统和嵌入式应用中。

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进行置位操作。

除了使用基本的位操作函数外,LV中还可以使用另外一种独特的方法进行位操作,这是其它编程语言不具备的。我们知道LABVIEW中的布尔数据类型与位非常类似,不过是存储空间不同。LABVIEW中的布尔数组和按字节、字进行位操作极为类似。因此可以先把字节、字转换为布尔数组,进行相应的位操作后在转换回字节、字。如下图所示,实现的是置位操作,与上图效果相同。

布尔数组可以直接转换成U32,因此使用上述方法操作双字更为方便,由于中间经过了多次转换,可能运行效率会低于直接使用位操作。在下面的其它位操作中,将同时演示两种不同的方法。

四、复位(关闭位)

复位操作与置位操作相反,复位操作使某个位的值恢复为0状态,这是默认状态,因此称作复位。

对掩码按位取反,则只有一位为0,其它位均为1,与字节进行与

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top