在VB中,如何快速实现数据的位移功能?
有一Integer 变量数组A,其数据如下
A(2) A(1) A(0)
1100 0101 1111 0010 1000 1010 0011 1011 0011 0110 1010 1100
执行左移操作后,数据如下,A(0)的最高位bit15进位为A(1)的最低位bit0;A(1)的最高位bit15进位为A(2)的最低位bit0;A(2)的最高位bit15移出;
A(2) A(1) A(0)
1000 1011 1110 0101 0001 0100 0111 0110 0110 1101 0101 1000
我知道在C中可以快速实现,在VB中如何快速实现(须考虑比较大的数组)?
谢谢!
问题点数:50、回复次数:12Top
1 楼viena(维也纳N02)回复于 2005-04-12 16:04:33 得分 0
VB的软肋!
很遗憾,VB中没有移位运算的~Top
2 楼viena(维也纳N02)回复于 2005-04-12 16:06:47 得分 5
可以用其他运算来模拟,但很麻烦而且效率极低
VB中无符号整数只有8位的ByteTop
3 楼Alex_C(广义上的好人)回复于 2005-04-12 16:20:16 得分 0
谢谢 viena(维也纳nn-实心木头人) 的支持!
但我想知道有无具体而又快速的方法实现。Top
4 楼viena(维也纳N02)回复于 2005-04-12 16:24:03 得分 0
没办法啊~Top
5 楼qiqi5521()回复于 2005-04-12 16:41:50 得分 0
用数组做一个快表,用查表法。即使如此也会比VC慢很多(大约速度不及VC的1/3)。Integer的移位表要占用2MB的内存,最好用完之后立即释放空间。Bye类型和Integer都可以用快表移位,Long类型不行,因为没有那么大的空间。Top
6 楼qiqi5521()回复于 2005-04-12 18:03:55 得分 25
我给你个具体的方法吧。
如果你能用VC开发DLL,最好不过了,混合编程恐怕是弥补VB的移位缺陷的最彻底的解决方法了。用混合编程要注意:要整块的传递数据、处理数据,不要一次只传递一个字节来处理。因为DLL函数调用的开销也是很大的。
如果不用混合编程,要用纯VB,那么你应该有心理准备,不可能赶上VC的移位速度,甚至连二分之一的速度都不及。
VB中的字节类型可以用查表法,造个表,只需要占用 256a*7*2 个字节的空间。
定义如下: aSHLB(0 to 255,1 to 7) as byte'字节左移表
aSHRB(0 to 255,1 to 7) as byte''字节右移表
Integer类型也可以用查表法,占用 65535 * 15 *2 个字节的内存空间。
定义如下:aSHLW(0 to &Hffff&,1 to 15) as integer'单字的左移表
aSHRW(0 to &Hffff&,1 to 15) as integer'单字的右移表
注意:Integer是有符号类型,造表的时候要用它的无符号值来造表,同样查表的时候也要用它的无符号值来查表。(因为数组下标是不允许负数的。)
求Integer类型无符号值的方法是:(Int and &hFFFF&),注意,不等同于CLng(Int)
同时,造表也要尽量的快,不然造表也会浪费大量的时间。
Long类型无法造表,因为表的大小超出总的内存地址空间。Top
7 楼Alex_C(广义上的好人)回复于 2005-04-12 18:40:04 得分 0
谢谢 qiqi5521() 的方法,回头我试试!
我刚试了一个方法,方法如下,请帮忙看看有什麽问题,
Static blnStatus As Boolean
Dim i As Integer
Dim n As Integer
Dim lngTemp As Long
Dim blnPCB As Boolean
Dim intPCBPos(0 To 100) As IntegerEnd If
For i = 0 To 100
n = intPCBPos(i)
lngTemp = intPCBPos(i)
lngTemp = lngTemp * 2
intPCBPos(i) = Val("&H" & Right(Hex$(lngTemp), 4))
If blnPCB Then
intPCBPos(i) = intPCBPos(i) Or &H1
Else
intPCBPos(i) = intPCBPos(i) And &HFFFE
End If
If n And 2 ^ 15 Then
blnPCB = True
Else
blnPCB = False
End If
Next
Top
8 楼qiqi5521()回复于 2005-04-12 19:14:39 得分 0
lngTemp = intPCBPos(i)
这一句,我想你的目的是把intPCBPos(i)的低16位复制到长整形的低16位,然而事与愿违,这句代码发生了什么?他是按数值复制变量,而不是按位复制变量,假如 intPCBPos(i)是 FFFF,它的十进制值被解释成-1,那么lngTemp = intPCBPos(i)做了什么?它把-1复制给了lngTemp,那么现在lngTemp是FFFFFFFF,而不是你期望的0000FFFF。Top
9 楼qiqi5521()回复于 2005-04-12 19:25:09 得分 0
改成:
lngTemp = (intPCBPos(i) And &HFFFF&)
可达到你的目的,然后紧接着一句:lngTemp = lngTemp * 2 '把这个临时的长整形变量左移一位,这句没问题。
接下来一句,看来无问题。
intPCBPos(i) = Val("&H" & Right(Hex$(lngTemp), 4))
在接下去的代码正在看
你先调调看,还有没有问题Top
10 楼leolan(史留香)回复于 2005-04-13 08:30:40 得分 20
http://blog.yesky.com/Blog/hunter/archive/2005/03/31/98208.htmlTop
11 楼Alex_C(广义上的好人)回复于 2005-04-14 22:47:22 得分 0
谢谢 qiqi5521() 的指点!
lngTemp = intPCBPos(i)
我在测试中好像没发现什麽问题,可以通过.
lngTemp = (intPCBPos(i) And &HFFFF&)
这样做更安全点,也能避免调试时发生误会,谢谢!
谢谢 leolan(史留香)的提供链接!那是不是你的Blog?Top
12 楼qiqi5521()回复于 2005-04-15 12:45:58 得分 0
的确.那样写确实没什么影响.是我当时没仔细想,呵呵.Top




