位操作是自动化控制中经常遇到的问题,最近看到论坛上有人提到字节高四位和低四位提取的问题,今天仔细探讨一下位的操作. 位不等于labview中的布尔量BOOLEAN占一个字节,和U8 I8相同,在内存中都是一个字节. 而一个字节是由8个位组成的,所以一个字节可以表示8个开关量. 最简单地操作是BOOLEAN 转换成I16,LV本身提供,FALSE---->0,TRUE---->1 数字转换成BOOLEAN,LV没提供,实际用!=0判断就可以了,非0既为真 因为BOOLEAN和I8 U8同占一个字节,因此转换也可以直接用CAST函数实现 因为LABVIEW提供了NUM-->BOOLEAN ARRAY和BOOLEAN ARRAY--->NUM的转换,所以很容易通过BOOLEAN数组替换实现对数的位的置位复位操作.NUM的类型可以是I8、I16、I32和I64 取出一个字节的高四位和低四位,可以通过计算和移位两种方式实现,C语言一般用移位的方式实现,速度比较快,而BASIC语言是通过计算实现的。 对于移位,在LV里有三种方法,1,直接用移位VI,2、利用公式节点 3、MATHSCRIPT提供了位操作函数。 下面演示一下几种方法: 对于某一位置1可以通过NUM OR 0X08 实现(BIT3,从0开始),置0可以用NUM AND !0X08实现,当然也可以通过上面的BOOLEAN数组的操作实现,不过位本身操作速度应该更快一些。 补充: 我把上面的程序都放在一个后面板里,如下图: 对应前面板: 作者主要是讲位的运算。我想如果要更好地去理解作者地本意,很有必要了解以下几点: 1:labview对位的定义。一般地,一个字节是八位。这八位在排列的时候,低位在右边,高位在左边。如:D7。。。D1D0。但是在labview中,位的排列是低位在左边,高位在右边。如:D0。。。D6D7,刚好跟我们熟悉的位排列方式相反。这从上面前面板的布尔数组显示情况很容易看出来。 2:正确选择数组输入控件的表示法。前面板上,如果原值表示法为v8(无符号字节整数,8位),相应的布尔输出数组刚好选中8个布尔量。但如果原值表示法为v16(无符号字整数,16位),相应的布尔输出数组刚好选中16个布尔量。 3:对节点(Logical Shift)的理解。 该节点完整表示为:。在labview的帮助文档中,是这样解释的: y can be any numeric representation. If y is greater than 0, the function shifts x left y bits (from least significant to most significant bit) and inserts zeros in the low-order bits. If y is less than 0, the function shifts x right y bits (from most significant to least significant bit) and inserts zeros in the high-order bits. 在理解上,要区分,到底x是往左移动还是往右移动y位数。刚开始,我就理解错了。可能也是我英文不好的缘故。是这样: 如果y>0,则x从低位(左边)往高位(右边)移动y位,然后在低位补上0。如x是11010010,y是4,则x< 对于 y<0,结果刚好相反。
|