一段代码位运算是什么意思
vb吧
全部回复
仅看楼主
level 1
ah20052005hf 楼主
VB HOOK的
源代码如下:
https://blog.csdn.net/weixin_30460489/article/details/99573270
请问如下代码:
If (Msg.wParam And &HFFFF0000) / &H10000 = EN_CHANGE Then
查了很多资料都看不懂,为啥进行位运算。
2021年09月28日 13点09分 1
level 13
不是很懂,不过这意思好像是把一个long(32位整数)分成2个integer(16位整数),然后取低16位
2021年10月12日 06点10分 2
他是取的高16位,不是低16位,看我在楼下的讲解。[滑稽]
2021年10月22日 02点10分
level 14
VB6的一个Long是32位整数,因为可以做拆分为两个16位的Integer处理,你给的例子的就是通过位运算的拆分方式:
高16位 = (32位 And &HFFFF0000) \ &H10000 ' 注意,VB6的\才是整除,/是浮点数除法。
低16位 = 32位 And &H0000FFFF&
不过我个人建议最好不要在VB6里面使用这种方式来拆分高低位,因为取高位涉及除法运算效率很低,而低位取出来是0~65535如果赋值给Integer类型就会溢出错误。
既高效又安全的做法如下:
Private Type DWrod
LoWord As Integer
HiWord As Integer
End Type
Private Declare Function SplitLong Lib "msvbvm60" Alias "#644"(ByVal Value As Long) As DWord
Private Sub Command1_Click()
Dim dw As DWord
dw = SplitLong(&H12345678)
?Hex$(dw.LoWord) ' 输出 5678
?Hex$(dw.HiWord) ' 输出 1234
End Sub
2021年10月22日 02点10分 3
其实先用And取出高16位的目的就是为了防止用浮点除法(/)计算出错,如果用整数除法就不需要先计算And了;另外,符号位确实是个问题,你的方法是更好的
2021年10月22日 02点10分
@初音✨七奈 不先 And 的话,\会使负数向上取整,而不是向下取整。所以整除仍然要先And一次。
2021年10月22日 02点10分
1