| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 10603 人关注过本帖
标题:VB中怎样实现移位运算
只看楼主 加入收藏
zhang_551799
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2016-6-21
结帖率:0
收藏
已结贴  问题点数:20 回复次数:6 
VB中怎样实现移位运算
请问怎样用VB来实现下面C程序,怎样进行移位运算

//将4个8位参数组合成32位整型
int ComposeIntParam(unsigned char *param1)
{
 int tempdata;
 tempdata = param1[0] << 24;
 tempdata |= param1[1] << 16;
 tempdata |= param1[2] << 8;
 tempdata |= param1[3];
 return tempdata;
}

//分解32位整型为4个8字节数
void DecomposeIntValue(unsigned char *a,int
chValue)
{
 a[0] = chValue >> 24;
 a[1] = chValue >> 16;
 a[2] = chValue >> 8;
 a[3] = chValue;
}
2016-06-21 15:15
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:7 
刚学一个命令,就用了。虽然C程序执行效率更高,但单纯用VB也能实现这个功能。
代码中使用的是二种方法,方法一实现方法与C完全不同。
方法二,与C实现的原理是相同的

程序代码:
Option Explicit

Private Type LongType
'4字节
    Value As Long
End Type

Private Type ByteType
'4字节
    Value(0 To 3) As Byte
End Type

Private Sub Command1_Click()

'调用测试
Cls

Dim a(3) As Byte
Dim b As Long
Dim i As Long

'测试数据
a(0) = 56
a(1) = 64
a(2) = 32
a(3) = 21

'生成32位长整数
Print "方法一"
b = ComposeIntParam(a())
Print b

'清理数组
For i = 0 To 3
    a(i) = 0
Next i

'生成字节数组
Call DecomposeIntValue(a(), b)
For i = 0 To 3
    Print a(i)
Next i


'方法二
Print "方法二"
b = ComposeIntParam2(a())
Print b
'清理数组
For i = 0 To 3
    a(i) = 0
Next i

'生成字节数组
Call DecomposeIntValue2(a(), b)
For i = 0 To 3
    Print a(i)
Next i



End Sub



Public Function ComposeIntParam(param1() As Byte) As Long
'4byte 转 1 long
'低位在前

Dim i As Long
Dim b As ByteType
Dim l As LongType
'把参数放入字节结构
For i = 0 To 3
    b.Value(i) = param1(i)
Next i
'转长整数结构
LSet l = b
'输出值
ComposeIntParam = l.Value
End Function

Public Sub DecomposeIntValue(a() As Byte, chValue As Long)
'1 long 转 4 byte
'低位在前

Dim i As Long
Dim b As ByteType
Dim l As LongType

'把参数放入结构
l.Value = chValue
'转字节数组
LSet b = l

'转输出数组
For i = 0 To 3
    a(i) = b.Value(i)
Next i

End Sub

Public Function ComposeIntParam2(param1() As Byte) As Long
'4byte 转 1 long
'低位在前

ComposeIntParam2 = param1(3) * 256& * 256 * 256
ComposeIntParam2 = ComposeIntParam2 + param1(2) * 256& * 256
ComposeIntParam2 = ComposeIntParam2 + param1(1) * 256&
ComposeIntParam2 = ComposeIntParam2 + param1(0)

End Function


Public Sub DecomposeIntValue2(a() As Byte, chValue As Long)
'1 long 转 4 byte
'低位在前

Dim j As Long

a(3) = Int(chValue / (256& * 256 * 256))
j = chValue - a(3) * 256& * 256 * 256

a(2) = Int(j / (256& * 256))
j = j - a(2) * 256& * 256

a(1) = Int(j / 256&)
a(0) = j - a(1) * 256&

End Sub



授人于鱼,不如授人于渔
早已停用QQ了
2016-06-21 16:23
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
备注:通常还有一种方法 ,使用 复制内存API函数 的方法来实现。与方法一实现原理差不多,但代码要简洁很多。
方法一只是使用 lset 命令来代码复制内存的 API 函数,执行 lset 命令里有特殊要求,所以显的不简洁。

授人于鱼,不如授人于渔
早已停用QQ了
2016-06-21 16:26
xiangyue0510
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:86
帖 子:941
专家分:5244
注 册:2015-8-10
收藏
得分:7 
这个没用到过,学习学习啊
话说楼主什么情况用到这样的功能??
2016-06-21 17:06
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:7 
在c里面用union类型轻松解决,完全不关位移的事。
vb里可以自己写,分解是除256的几次幂,联合是乘256的几次幂,这都不是事。也可以按照2、3楼版主的思路解决。

能编个毛线衣吗?
2016-06-21 23:19
zhang_551799
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2016-6-21
收藏
得分:0 
感谢,解决问题。使用情况是:采集器将数据定标定长分解为4字节,通过网络发送给客户端,客户端还原数据并使用。版主的方法一很好用。方法二我昨天试过,当是负数时就有问题了。另外,3楼说的“还有一种方法”请再指教一下。
2016-06-22 13:13
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
'声明
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)


代码:
'生成32位长整数
Print "方法三"
CopyMemory b, a(0), 4
Print b

'清理数组
For i = 0 To 3
    a(i) = 0
Next i

'生成字节数组
CopyMemory a(0), b, 4
For i = 0 To 3
    Print a(i)
Next i

------------------------
说明,这种方法,是使用的复制内存的方法进行,可以不需要自定义函数,只需一行命令就可以完成,非常简洁。
但存在的问题:
1、调用API函数,对于不熟悉的人来说,需要一定的学习时间
2、程序的健壮性。如果调用时出现错误,在IDE模式下会导致整个VB无报错直接退出。编译后报该内存不能为写。
3、内存直接读写,涉及到系统安全性,误操作时,有可能导致整个系统崩溃。

授人于鱼,不如授人于渔
早已停用QQ了
2016-06-22 15:49
快速回复:VB中怎样实现移位运算
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030309 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved