More Faster , More VB User

VB公农历1.02版,不需要任何DLL 建一个Form1,然后添加一个CommandButton,贴上以下代码做测试。Option ExplicitPrivate Sub Command1_Click()   Dim t As clsDate   Dim y As Long   Dim m As Long   Dim d As Long   Dim st As Single   Dim et As Single   Dim da As 阅读详情

More Faster , More VB User

                                        ——VB位操作

 

为什么VB中不加入位操作的语法元素,我想主要是比尔的电脑比大多数人的电脑要快上几百倍。他可能觉得已经够了。

 

                                       —— Llib.Setag

 

 

 

这篇文章是用来解决VB中位操作方面的问题,我想。其实这篇文章我来写有点太显摆,因为其中很多代码不是我的原创,虽然其中很多技术虽然早已用过很多回,但是用到位操作上,特别是利用数组来进行高低位取字(字节)是我没有想到的,这是优快云 qiqi5521的功劳,感谢他的代码。

 

代码中主要用到了三种技术:

 

数组技术、指针技术、内嵌汇编技术

 

这三种技术实际上并不是我们所凭空想出来了,基本上是来源于《Hardcore VB》和《Advanced Visual Basic》两书所提出来的方法。虽然这三种技术在一般的VB教课书上是不会提起的,但是由于它具有一定的实用性,在很多地方,特别是要求速度的地方可以加快代码不少的运行速度。关于具体的技术,我不太想在这篇文章中谈,如果有兴趣可以参考我的Blog: http://blog.youkuaiyun.com/BlueDog,里面有一个《VB深度下潜》系列,虽然没有写完,但这些技术会陆续提到。

 

代码、代码、还是代码,对于程序员而言,代码是最好的教课书。代码是我们的生存之道。然而在代码之前,还有几句要说的,在本模块中包括了几个版本的代码,显得有些乱,分别是一般速度、较高速度和最高速版。另外在代码中有两个函数是一定要记得使用,分别是

 

BitOperatorInit和BitOperatorEnd,这两个函数是分别在位操作前后使用。本模块引用了 WinAPI ANSI Typlib。

 

来了,代码来了。

 

建立一个modBit的模块,将以下代码拷入。

 

Option Explicit

' 版本更新记录

'

'     2004-12-23  增加利用内存共享开发新的函数HiByteFastest ......

'                 本版本新增函数利用优快云上 qiqi5521的代码进行了改进

'

 

 

Private Type BIT_WORD

   LoByte As Byte

   HiByte As Byte

End Type

 

 

Private Type BIT_DWORD

   LoWord As Integer

   HiWord As Integer

End Type

 

 

Private Type BIT_DWORD_BYTE

   LoByte As Byte

   SeByte As Byte

   ThByte As Byte

   HiByte As Byte

End Type

 

 

Private BitPower(31) As Long '0-31

Private BitRight32Code(23) As Byte

Private SHR32Addr As Long '汇编函数地址

 

 

Private BitLeft32Code(23) As Byte

Private SHL32Addr As Long '汇编函数地址

 

 

 

 

Private Type SafeArray1d '1维数组的 SafeArray 定义

    cDims As Integer '维数

    fFeatures As Integer '标志

    cbElements As Long '单个元素的字节数

    clocks As Long '锁定计数

    pvData As Long '指向数组元素的指针

    cElements As Long '维定义,该维的元素个数

    Lbound As Long '该维的下界

End Type

 

 

Const FADF_AUTO = &H1

Const FADF_FIXEDSIZE = &H10

 

 

Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (ptr() As Any) As Long

 

 

Private m_SA1DLong As SafeArray1d

Private m_SA1DInt As SafeArray1d

 

 

Private m_lSharedLong As Long '要被共享的长整形

Private m_aiIntsInLong() As Integer '要共享长整形地址空间的整形数组

 

 

Private m_lSharedInt As Integer

Private m_aiBytesInInt() As Byte

'////////////////////////////////////////////////////////////////////////////////////////////////

'位操作前初使化动作,主要是初使化,如果不进行初使化,将会出现不可预计错误

Public Sub BitOperatorInit()

   Dim i As Long

   Dim AsmCodeByte

   For i = 0 To 30

      BitPower(i) = 2 ^ i

   Next

   BitPower(31) = &H80000000

      

    AsmCodeByte = Array( _

    &H55, &H8B, &HEC, &H83, &HEC, &H44, &H53, &H56, _

    &H57, &H8B, &H45, &H8, &H8B, &H4D, &HC, &HD3, _

    &HE8, &H5F, &H5E, &H5B, &H8B, &HE5, &H5D, &HC3)

    For i = 0 To 23

       BitRight32Code(i) = AsmCodeByte(i)

    Next

    SHR32Addr = VarPtr(BitRight32Code(0))

             

    AsmCodeByte = Array( _

    &H55, &H8B, &HEC, &H83, &HEC, &H44, &H53, &H56, _

    &H57, &H8B, &H45, &H8, &H8B, &H4D, &HC, &HD3, _

    &HE0, &H5F, &H5E, &H5B, &H8B, &HE5, &H5D, &HC3)

    For i = 0 To 23

       BitLeft32Code(i) = AsmCodeByte(i)

    Next

    SHL32Addr = VarPtr(BitLeft32Code(0))

      

    With m_SA1DLong

        .cDims = 1

        .fFeatures = 17

        .cbElements = 2

        .clocks = 0

        .pvData = VarPtr(m_lSharedLong) '使数组的数据指针指向长整形变量m_lSharedLong

        .cElements = 2

        .Lbound = 0

    End With

 

 

    '使数组变量(其实就是个指针)指向我们自己创建的 SafeArray1d 结构

    CopyMemory ByVal VarPtrArray(m_aiIntsInLong), VarPtr(m_SA1DLong), 4

      

    With m_SA1DInt

        .cDims = 1

        .fFeatures = 17

        .cbElements = 1

        .clocks = 0

        .pvData = VarPtr(m_lSharedInt) '使数组的数据指针指向长整形变量m_lSharedLong

        .cElements = 2

        .Lbound = 0

    End With

    CopyMemory ByVal VarPtrArray(m_aiBytesInInt), VarPtr(m_SA1DInt), 4

End Sub

 

 

' 在位操作运算完成后一个要调用此函数

'释放资源,程序结束前一定要调用

Public Sub BitOperatorEnd()

 

 

'把数组变量(其实就是个指针)指向 0,既 C 语言中的 NULL

CopyMemory ByVal VarPtrArray(m_aiIntsInLong), 0&, 4

CopyMemory ByVal VarPtrArray(m_aiBytesInInt), 0&, 4

 

 

End Sub

 

 

'///////////////////////////////////////////////////////////////////////////

'取高位整型最快的版本

Public Function HiWordFastest(ByRef Num As Long) As Integer

    m_lSharedLong = Num

    HiWordFastest = m_aiIntsInLong(1)

End Function

'取低位整型最快的版本

Public Function LoWordFastest(ByRef Num As Long) As Integer

    m_lSharedLong = Num

    LoWordFastest = m_aiIntsInLong(0)

End Function

'取高位Byte最快的版本

Public Function HiByteFastest(ByRef Num As Integer) As Integer

    m_lSharedInt = Num

    HiByteFastest = m_aiBytesInInt(1)

End Function

'取低位整型最快的版本

Public Function LoByteFastest(ByRef Num As Integer) As Integer

    m_lSharedInt = Num

    LoByteFastest = m_aiBytesInInt(0)

End Function

 

 

'///////////////////////////////////////////////////////////////////////////

'位测试 ,测试位为1 返回真

Public Function BitTest32(Number As Long, Bit As Long) As Boolean

    If Number And BitPower(Bit) Then

      BitTest32 = True

    Else

      BitTest32 = False

    End If

   

End Function

 

 

'将某位设置为1并返回值

Public Function BitSet32(Number As Long, Bit As Long) As Long

   BitSet32 = BitPower(Bit) Or Number

End Function

 

 

 

 

'无符号扩展,最好作为内嵌到函数内部,减少调用开支。 注意,它与Clng有本质的区别

Public Function WORD2DWORD(Num As Integer) As Long

   WORD2DWORD = Num And &HFFFF&

End Function

 

 

 

 

'逻辑右移32位函数

Public Function SHR32(ByRef Num As Long, BitNum As Long) As Long

    SHR32 = CallWindowProc(ByVal SHR32Addr, Num, BitNum, 0, 0)

End Function

 

 

'逻辑左移32位函数

Public Function SHL32(ByRef Num As Long, BitNum As Long) As Long

    SHL32 = CallWindowProc(ByVal SHL32Addr, Num, BitNum, 0, 0)

End Function

 

 

'没有采用汇编码,如果需要也可以采用,但16位的汇编码较32位的差很多,此函数速度约比SHR32慢一倍左右还可以

Public Function SHR16(ByRef Num As Integer, BitNum As Long) As Integer

    Dim mdw As BIT_DWORD

    Dim rl As Long

    mdw.LoWord = Num

    CopyMemory rl, mdw, 4

    rl = CallWindowProc(ByVal SHR32Addr, rl, BitNum, 0, 0)

    CopyMemory SHR16, rl, 2

End Function

 

 

Public Function SHL16(ByRef Num As Integer, BitNum As Long) As Integer

    Dim mdw As BIT_DWORD

    Dim rl As Long

    mdw.LoWord = Num

    CopyMemory rl, mdw, 4

    rl = CallWindowProc(ByVal SHL32Addr, rl, BitNum, 0, 0)

    CopyMemory SHL16, rl, 2

End Function

'///////////////////////////////////////////////////////////////////////////////////////////

' 如果对性能没有太大要求,或没能理解上面的函数的作法,可以用以下几个函数。

' 一般不建议使用

 

 

Public Function HiByte(ByRef Num As Integer) As Byte

    Dim mw As BIT_WORD

   

    CopyMemory mw, Num, 2

    HiByte = mw.HiByte

End Function

 

 

Public Function LoByte(ByRef Num As Integer) As Byte

    CopyMemory LoByte, Num, 1  '可以省掉一次取值,

End Function

 

 

Public Function HiWord(ByRef Num As Long) As Integer

    Dim mdw As BIT_DWORD

   

    CopyMemory mdw, Num, 4

    HiWord = mdw.HiWord

End Function

 

 

Public Function LoWord(ByRef Num As Long) As Integer

   

    CopyMemory LoWord, Num, 2

   

End Function

 

 

'比LoWord更快一点的版本(但如果内置于一个大函数内,可能用loword更好,因为代码更清晰)

Public Function LoWordFaster(ByRef Num As Long) As Integer

    If (Num And &H8000&) Then   ' dw And &H00008000  来进行确定低位是不是负数

         LoWordFaster = Num Or &HFFFF0000

    Else

         LoWordFaster = Num And &HFFFF& 'dw And &H0000FFFF

    End If

End Function

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

汇编 I/O 与中断:端口读写、中断向量表与 ISR 本文详解x86架构下I/O端口与中断机制,涵盖端口映射、IN/OUT指令、中断向量表(IVT)结构及中断处理流程。通过实模式下的键盘、定时器等硬件示例,揭示操作系统如何通过中断实现硬件管理,并演示自定义中断服务程序的安装与正确调用方式,强调保护现场、读取扫描码、避免重入等关键细节,为理解操作系统底层交互提供坚实基础。 阅读详情

相关推荐

C 与汇编混合编程:符号链接、调用约定与参数传递

本文详解汇编与C语言混合编程的实现原理,涵盖PUBLIC与EXTERN指令的使用、32位调用约定(参数从右往左压栈、调用者清栈)、栈帧布局及寄存器保护规则。通过实例展示C调用汇编函数与汇编调用C库(如printf)的写法,并对比32位与64位(Windows x64)在参数传递、返回值和栈对齐上的差异。强调边界清晰的重要性,确保跨模块调用稳定可靠,适用于性能优化、硬件操作及学习底层机制场景。

软件工程师文艺 337

bit,byte,word的关系与说明

bit(比特): 0或1,计算机是以比特序列来储存数据的。例如01010011,大多数计算机就是以2的整数次幂来处理内存的,最小的内存块成为“字节”,储存的基本单位称为“字”。 byte(字节): 大部分机器的字节是以8比特构成,一个byte表示无符号类型unsigned表示为0-255之间的值,表示有符号为-128-127。何为有符号类型,即可以表示为负数,0,正数,而无符号类型则仅表示为大于...

algsup 2万+

TwinCAT3入门教程3——PLC程序变量定义和硬件IO关联

目录 1、IO输入输出变量定义和硬件关联 1.1 IO输入 1.2 IO输出 1.3 PLC变量和IO模块关联 1.4 测试IO输出点 2、伺服变量关联 1、IO输入输出变量定义和硬件关联 1.1 IO输入 添加全局变量IO_Global 变量定义 (*==========================================IO输入===============================================================*)

panjinliang066333的博客 1万+

将指定范围内的比特流(通常是数字数组)转换为一个字符串

这段 MATLAB 代码的作用是将指定范围内的比特流(通常是数字数组)转换为一个字符串,具体过程包括从数字到字符的转换。

weixin_44012667的博客 440

深度学习中的注意力机制

最近两年,注意力模型(Attention Model)被广泛使用在自然语言处理、图像识别及语音识别等各种不同类型的深度学习任务中,是深度学习技术中最值得关注与深入了解的核心技术之一。本文以机器翻译为例,深入浅出地介绍了深度学习中注意力机制的原理及关键计算机制,同时也抽象出其本质思想,并介绍了注意力模型在图像及语音等领域的典型应用场景。

优快云人工智能 4万+

手把手教你用VSCode+SDL在Ubuntu上跑LVGL8.2模拟器(附插件清单)

本文详细介绍了在Ubuntu系统上使用VSCode和SDL库搭建LVGL8.2模拟器环境的完整流程,特别适合嵌入式开发者(如全志F1C100s平台)进行UI设计验证。从环境配置、项目编译到VSCode深度集成,提供了实用技巧和常见问题解决方案,帮助开发者实现'先模拟后真机'的高效开发模式。

weixin_33737134的博客 358

可以装逼的位运算

Hacker's Delight高效程序的奥秘和stanford这篇文章,用位运算不想装逼都难 http://graphics.stanford.edu/~seander/bithacks.html Bit Twiddling Hacks By Sean Eron Andersonseander@cs.stanford.edu Individually, thecode snippets...

weixin_30609287的博客 759

计算机视觉之姿态识别(原理+代码实操)

计算机视觉中的姿态识别原理+模型介绍,同时通过代码实操简单的演示基于mediapipe的单人姿态识别。

输出既学习 3万+

【WINCC】16个Bit转Word

一、在全局脚本里面新建两个函数: 代码如下: ''' '''16个Bit转Word '''接收参数为包含16个元素的数组 '''其中每个元素依次对应16个Bit中的一个 Function bits2Word(Byval arr) Dim res res = 0 If Not IsArray(arr) Then Msgbox "arr is not a array."

Blog@wp 3609

从X86到ARM:将VINS-Fusion-GPU和ego-planner迁移到Jetson Orin-NX时,我踩过的那些‘环境差异’坑

本文详细介绍了将VINS-Fusion-GPU和ego-planner从X86平台迁移到Jetson Orin-NX(ARM架构)时遇到的环境差异问题及解决方案。内容涵盖ARM与X86的架构差异、依赖管理、性能调优和硬件接口适配,特别强调了CUDA在ARM平台上的优化配置和内存访问技巧,帮助开发者高效完成跨平台迁移。

weixin_42647395的博客 119

078、镜头阴影校正:LSC算法原理与标定优化

文章摘要 镜头阴影校正(LSC)是手机影像系统中的关键技术,用于解决镜头渐晕效应导致的画面边缘暗角问题。本文详细分析了LSC算法的核心原理,包括非均匀网格划分、双线性插值等关键技术点,并揭示了标定流程中的常见陷阱(光源均匀性、灰卡反射特性、温度漂移)。文章还深入探讨了增益计算的工程实现细节,以及实际调优中的关键考量因素(色差校正、动态场景适应等)。作者结合15年经验,给出了包括验证方法、网格参数设计、产线标定等实用性建议,强调LSC算法应与光学设计协同优化,才能达到最佳效果。

sundong_81的博客 42

编译器 | 从工业实现到极简设计 —— 编译器的多元形态与实践

……

u013669912的博客 888

手把手教你学Simulink--基础电机控制场景实例:基于Simulink的无刷直流电机六步换相仿真

摘要:本文详细介绍了基于Simulink的无刷直流电机(BLDC)六步换相仿真方法。文章首先阐述了BLDC六步换相控制的原理,包括霍尔传感器定位、六步换相逻辑和方波电流驱动三大支柱。然后通过电动工具(角磨机)应用场景,展示了如何在Simulink中搭建完整的六步换相系统:从主电路构建、霍尔信号生成、Stateflow换相逻辑实现到开环电压控制。仿真结果显示该系统具有低成本优势(仅需霍尔传感器),但存在±20%转矩脉动。文章还提供了核心代码实现,包括霍尔信号生成、六步换相状态机和转矩分析脚本,并对比了六步换相

MHD0815的博客 149

VB深度下潜 之 一米深度(VB指针入门)

前 言   本来我也是非常赞同网上一个流行的观点,VB只是一个玩具。诚然,作为一个VB的普通使用者的确无法玩出更多的东东。但是,这几个月我完全不管VB的普通应用,而是一头扎入COM的海洋里,凭着潘爱民老师的一片小帆《COM原理及应用》以及一袋干粮《Advance Visual Basic》。居然在冰冷的技术海洋里转了几个月。终于发现了一个VB惊天之迷。然后当然有了这个长篇。如里

BlueDog专栏 3544

基于Simulink进行多相电机EMI抑制的仿真建模

特点高可靠性:通过增加相数来提供冗余,增强系统的故障容忍度。低转矩脉动:改善了电机的动态性能,减少了转矩波动。复杂的EMI管理:更多的相数意味着更复杂的电磁环境,增加了EMI抑制的难度。挑战模型复杂性:涉及电气、机械和电磁场等多个领域的相互作用。实时性要求:控制系统需要能够快速响应以适应动态负载变化。多变量优化:包括滤波器设计、PWM调制策略等在内的多个参数需综合考虑以找到最优解。使用Simscape Electrical库来构建一个多相电机模型。

amy_mhd的博客 272

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

VB二进制快速读写类

利用自建的文件缓冲区来提高文件读写速度,下面是与VB 自带的Put Get 进行比较//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////测试代码 :Fo

BlueDog专栏 3281

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

VB 深度下潜之 海蛇缠绕

下潜深度(十米,水温0°C),时间北京时间零点整。  “海蛇”有人在惊呼。   只见在海底深处游来一条黑色的长长的海蛇,几乎所有的人都在发呆。但是海蛇说了一句让我们胆寒的话“我就是有名的VB字符串,如果你们继续下潜的话,就得想通过我”。   我习惯性的观察着它,因为我知道要打败一个对手,就必须深入的了解对手。   因此我写了一段小CODE来了解它。    Dim

BlueDog专栏 2621

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

汇编调试实战:DEBUG、Turbo Debugger、GDB 与 IDA

本文系统讲解汇编调试技巧,涵盖 DEBUG.exe 基础使用(寄存器查看、单步执行、内存操作)、Turbo Debugger 图形化调试,以及 GDB(32位Linux)和逆向工具(IDA/Ghidra)的高级应用。重点解析寄存器管理、断点设置、栈平衡检查与常见错误排查,如死循环、内存越界、栈崩溃等,强调静态分析识别函数边界、动态分析验证逻辑流程。掌握这些方法可高效定位底层缺陷,提升汇编开发能力。

软件工程师文艺 235

ARM 汇编调试入门:MOV、LDR 和 STR

掌握,最重要的是看清数据移动的方向。

ccddvvv的博客 181

10个完整汇编实例:排序、字符串与递归算法

本文提供10个16位实模式下可运行的汇编程序,涵盖冒泡排序、字符串反转、进制转换、阶乘与斐波那契计算等经典算法,附逐行解析。重点讲解寄存器使用、循环控制、栈操作、除法清零、符号比较、字符处理等核心技巧,揭示如PUSH/POP CX保全计数器、DIV前清DX、ASCII转换、溢出处理等关键细节。通过实践掌握底层逻辑,提升汇编编程能力。

软件工程师文艺 229

汇编子程序设计:参数传递、局部变量与调用约定

汇编代码模块化核心在于子程序设计。通过PROC/ENDP定义函数,结合栈帧管理(PUSH BP/MOV BP, SP)实现局部变量隔离与递归支持。参数传递可选寄存器(高效)或栈(多参适用),配合调用约定(如C、Pascal)规范参数入栈顺序与栈清理责任。掌握这些模式,便能编写结构清晰、可复用的汇编代码,迈向工程化开发。

软件工程师文艺 228

四级 Linux 应用与开发工程师笔记:8086 汇编、存储器、接口芯片和操作系统计算题整理

计算机四级 Linux 应用与开发工程师备考笔记:这门考的不是 Linux 命令,而是操作系统原理和计算机组成与接口两门课。组成与接口部分重点整理 8086 寻址方式、常考汇编指令和读程序题、存储器位扩展和字扩展、流水线时空图,接口芯片和中断按做题方法整理;操作系统部分整理高响应比优先、Clock 置换、两级页表、生产者消费者等考点,配真题讲解。

qq_39121450的博客 239

C 语言:编译 → 汇编 → 链接 → 加载运行

C程序从源码到执行经历预处理、编译、汇编、链接四阶段,生成ELF可执行文件,由操作系统加载至内存并由CPU执行。关键点包括:交叉编译生成ARM指令;链接分静态与动态;入口为_start而非main;动态库需-fPIC保证位置无关性;嵌入式环境下可能跳过OS直接运行。

嵌入式开发,ARM Linux开发 415

汇编分支与循环:JMP/LOOP/条件跳转的结构化编程

本文详解如何用汇编的JMP与条件跳转实现if/else、for、while等高级控制流。通过循环计数、嵌套循环及复杂判断的典型模式,展示底层指令如何构建逻辑结构。掌握LOOP指令与跳转组合,即可在无高级语法环境下实现高效、精准的程序控制,体现汇编语言的简洁与性能优势。

软件工程师文艺 256

直接操作 VGA 显存:用汇编控制文本显示

本文详解VGA文本模式下直接操作显存的原理与实践:通过段寄存器B800h访问显存,每字符占2字节(ASCII+属性),利用偏移公式(n×80+m)×2定位输出。属性字节控制颜色与闪烁,如1Ch为蓝底亮红字。使用MOV ES:[DI], AX结合REP STOSW可高效清屏,配合INT 10h实现光标重置与滚动窗口。深入理解显存映射,是掌握图形底层逻辑的关键。

软件工程师文艺 205
上一篇: VB 深度下潜之 海蛇缠绕
下一篇: VB二进制快速读写类
BlueDog
博客等级 码龄27年 104粉丝 62原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值