求高效的取高字节VB6的函数

test2002 2013-03-22 10:50:33
如题,不要使用copymemory函数,效率低。

...全文
1948 57 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
57 条回复
切换为时间正序
请发表友善的回复…
发表回复
PctGL 2013-04-06
  • 打赏
  • 举报
回复
数据量稍大的情况下,copymemory 字节数组映射法 无疑是最快的 位运算的情况仅适合小数据量 虽然位运算看似只用了寄存器而没用内存,但也并不一定就快,这要看指令 2~3次的copymemory就完全把一个long数组数据映射到byte数组中,数据就出来了,大数据量的情况下只有copymemory的耗时,其它则没有一丝一毫的耗时,位运算反而会慢,因为他要一个一个的算
嗷嗷叫的老马 2013-03-30
  • 打赏
  • 举报
回复
引用 55 楼 Tiger_Zhao 的回复:
是叫你去看现成的 HiByte,照样可以用整除。 哪有说直接复制过来就用的?
Tiger_Zhao 2013-03-28
  • 打赏
  • 举报
回复
是叫你去看现成的 HiByte,照样可以用整除。 哪有说直接复制过来就用的?
laviewpbt 2013-03-27
  • 打赏
  • 举报
回复
我天天在CSDN啊,没啥感兴趣的问题就不会冒泡的。
东方之珠 2013-03-27
  • 打赏
  • 举报
回复
引用 46 楼 laviewpbt 的回复:
这东西有什么争吵的,就是 HiWord01 = (lDWord And &HFFFF0000) \ &H10000 这个最快 这样简单的计算,不要写成函数调用的,直接内嵌。 \ &H10000 这样的计算,VB的编译器编译后会直接编译为移位的。 移位和位运算时最简单的CPU指令了。 http://www.xbeat.net/vbspeed/c_H……
老兄好久没来了,玩.Net去了! 赵老虎那个函数还真有出处啊,佩服!
laviewpbt 2013-03-27
  • 打赏
  • 举报
回复
这东西有什么争吵的,就是 HiWord01 = (lDWord And &HFFFF0000) \ &H10000 这个最快 这样简单的计算,不要写成函数调用的,直接内嵌。 \ &H10000 这样的计算,VB的编译器编译后会直接编译为移位的。 移位和位运算时最简单的CPU指令了。 http://www.xbeat.net/vbspeed/c_HiWord.htm
东方之珠 2013-03-27
  • 打赏
  • 举报
回复
引用 44 楼 test2002 的回复:
引用 43 楼 Tiger_Zhao 的回复: 引用 40 楼 test2002 的回复: 还有些人弄一个除法的东西,如果只是除65536就解决的,我在这费那么大劲做什么? 我36楼的代码,你如果不理解就做个测试,与 CopyMemory 的结果比较。 没有调查不要轻易下结论! 不明白,怎么有这个效果?低字是0就正确,什么原理?
跟C++的位运算是一样的。
test2002 2013-03-27
  • 打赏
  • 举报
回复
引用 43 楼 Tiger_Zhao 的回复:
引用 40 楼 test2002 的回复: 还有些人弄一个除法的东西,如果只是除65536就解决的,我在这费那么大劲做什么? 我36楼的代码,你如果不理解就做个测试,与 CopyMemory 的结果比较。 没有调查不要轻易下结论!
不明白,怎么有这个效果?低字是0就正确,什么原理?
Tiger_Zhao 2013-03-27
  • 打赏
  • 举报
回复
引用 40 楼 test2002 的回复:
还有些人弄一个除法的东西,如果只是除65536就解决的,我在这费那么大劲做什么?
我36楼的代码,你如果不理解就做个测试,与 CopyMemory 的结果比较。 没有调查不要轻易下结论!
test2002 2013-03-27
  • 打赏
  • 举报
回复
引用 52 楼 Tiger_Zhao 的回复:
[quote=引用 50 楼 test2002 的回复:]integer去高BYTE
integer高BYTE? 这不是 HiByte 的干活? 照样用整除![/quote] 还是有点区别,不过思路确实一样 byteA = ((Word And &HFF00) \ &H100) And &HFF
test2002 2013-03-27
  • 打赏
  • 举报
回复
引用 52 楼 Tiger_Zhao 的回复:
[quote=引用 50 楼 test2002 的回复:]integer去高BYTE
integer高BYTE? 这不是 HiByte 的干活? 照样用整除![/quote] 别想当然,自己测试去,直接死掉
Tiger_Zhao 2013-03-27
  • 打赏
  • 举报
回复
引用 50 楼 test2002 的回复:
integer去高BYTE
integer高BYTE? 这不是 HiByte 的干活? 照样用整除!
test2002 2013-03-27
  • 打赏
  • 举报
回复
Public Function MakeDWord05(ByVal LoWord As Integer, ByVal HiWord As Integer) As Long ' by G.Beckmann, G.Beckmann@NikoCity.de, 20001207 MakeDWord05 = (HiWord * &H10000) Or (LoWord And &HFFFF&) End Function MakeDWord06 Public Function MakeDWord06(ByVal LoWord As Integer, ByVal HiWord As Integer) As Long ' by Karl E. Peterson, http://www.mvps.org/vb, 20001207 ' High word is coerced to Long to allow it to ' overflow limits of multiplication which shifts ' it left. MakeDWord06 = (CLng(HiWord) * &H10000) Or (LoWord And &HFFFF&) End Function 谁来猜猜,谁快?
test2002 2013-03-27
  • 打赏
  • 举报
回复
引用 49 楼 Tiger_Zhao 的回复:
当年编基础函数库的时候参考过 VBSpeed,只要性能不是很离谱,大多数选用易用易懂的版本。 HiWord01 是少有的易用易懂又高效的。 比如4楼这种判断符号位的,当年也是一种版本,不过被 HiWord01 完败,下架了! 又: MakeDWord 函数,VB5/VB6 还有不同的冠军呢。 HiWord01 称得上完美。
HiWord = (DWord And &HFFFF0000) \ &H10000 堪称最完美,但如果integer去高BYTE,这个用不上了,必须参考 zGetLngHigh = (zLong And &H7FFF0000) \ &H10000 Or (((zLong And &H80000000) <> 0) And &H8000)
Tiger_Zhao 2013-03-27
  • 打赏
  • 举报
回复
当年编基础函数库的时候参考过 VBSpeed,只要性能不是很离谱,大多数选用易用易懂的版本。 HiWord01 是少有的易用易懂又高效的。 比如4楼这种判断符号位的,当年也是一种版本,不过被 HiWord01 完败,下架了! 又: MakeDWord 函数,VB5/VB6 还有不同的冠军呢。 HiWord01 称得上完美。
东方之珠 2013-03-26
  • 打赏
  • 举报
回复
引用 36 楼 Tiger_Zhao 的回复:
引用 2 楼 test2002 的回复: 获取Long的高字 Visual Basic code ? 123 Public Function HiWord(ByVal DWord As Long) As Integer HiWord = (DWord And &HFFFF0000) \ &H10000 End Function 扯远了吧。 要……
这个高效!
捧剑者 2013-03-26
  • 打赏
  • 举报
回复
test2002 2013-03-26
  • 打赏
  • 举报
回复
引用 35 楼 myjian 的回复:
引用 34 楼 worldy 的回复: 引用 10 楼 myjian 的回复:引用 9 楼 c0631106233 的回复: 支持一下先,不过不是很懂为什么要绕那么多弯?看代码是用MyLong的地址指针替换掉myIntegerArr数组的地址指针,不知道可不可这样 差别很大,HOHO. 我绕那么多弯,目的是让myIntegerArr()与myLong都指向同一个地址,类似C语言中的……
你的思路不错,可惜不能封装成类,影响了程序可读性,意义不大,能封装成类,不降低效率才好。
test2002 2013-03-26
  • 打赏
  • 举报
回复
还有些人弄一个除法的东西,如果只是除65536就解决的,我在这费那么大劲做什么?
Tiger_Zhao 2013-03-26
  • 打赏
  • 举报
回复
引用 37 楼 worldy 的回复:
可以更简单: Public Function HiWord(ByVal DWord As Long) As Integer HiWord = DWord \H10000 End Function
你以为 Long 是无符号整数啊!用 &HFFFFFFFF 试试,结果多少?
加载更多回复(37)

7,785

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧