分享

LABVIEW的深入探索之功能强大的位操作能力 来自 csxcs366的博客

 堆泄露栈溢出 2014-08-26

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

LABVIEW作为面向具体应用的工程师的编程语言,由于经常需要操作硬件设备寄存器,而寄存器往往都是需要位操作的,因此LABVIEW具有位操作能力是必须的。LABVIEW不仅具有强大的位操作能力,而且操作极其方便,这得益于LABVIEW具有一般编程语言不具备的特殊数据类型--布尔量。

相信经常使用C51和PLC的朋友们都非常熟悉位操作,51单片机具有自己的位寻址区,位寻址区不但可以进行位寻址,也可以按字节、字(双字节)寻址,PLC也是如此。但是很多设备和编程语言是不支持位寻址的,只允许字节或者字的方式,高级编程语言基本如此。

我在下面的文章中大致提及了LABVIEW中的位操作,但是是针对具体问题的,本文希望系统性地讨论一下LABVIEW中的位操作极其特点。

http://www./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,与字节进行与操作,则只有一位复位为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面向工程应用的特点。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多