CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  基础类

在VB中,如何快速实现数据的位移功能?

楼主Alex_C(广义上的好人)2005-04-12 15:57:16 在 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

相关问题

  • VB的数据库能实现这样的功能吗?
  • VB的表格如何实现数据批更新功能?
  • VB中有没有像delphi有数据库的调试功能?
  • VB中如何解决二进制位移运算(50-100)
  • 请教VB中的位移运算符是什么?
  • VB$数据库
  • vb数据库!
  • 数据搜索功能急!!!!!!!!!!!
  • 数据搜索功能急!!!!!!!!!!!
  • 请问VB中如何实现C语言中的位移命令 >> 和<<

关键词

  • vb
  • 数据
  • 内存
  • intpcbpos
  • lngtemp
  • 造表
  • blnpcb
  • 表
  • 数组
  • hffff

得分解答快速导航

  • 帖主:Alex_C
  • viena
  • qiqi5521
  • leolan

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo