首页
社区
课程
招聘
请指教Vb中字符左移问题
发表于: 2005-8-3 18:38 11495

请指教Vb中字符左移问题

2005-8-3 18:38
11495
在汇编中有这句话:
004018CB    .  C1E1 02         SHL ECX,2         //ecx左移两位
执行前ecx=CA79C866,执行后ecx=29E72198
然而我在vb中就出现问题了
变量a=CA79C866,执行完移位操作(a=a/(2^2))后,a=F29E721A,请问该如何修改这句左移位语句?
编程基础几乎没有,劳烦大侠指点。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 1223
活跃值: (469)
能力值: (RANK:460 )
在线值:
发帖
回帖
粉丝
2
应该是a=a*2^2吧
2005-8-3 23:31
0
雪    币: 296
活跃值: (250)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
3
多谢monkeycz版主指点,不过a=a*2^2就溢出了
然后查找了一下原因,发现windows自带计算器则将-897988506转换为FFFFFFFFCA79C866,而vb转换CA79C866为十进制则是-897988506,请问如何可以使vb将这个十六进制转换后为正数?
2005-8-4 10:58
0
雪    币: 1223
活跃值: (469)
能力值: (RANK:460 )
在线值:
发帖
回帖
粉丝
4
vb我不熟。应该定义a的数据类型为DWORD,或者进行强制类型转换就可以了。
2005-8-4 16:20
0
雪    币: 296
活跃值: (250)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
5
多谢monkeycz版主版主耐心指点,现在准备放弃了
2005-8-4 19:18
0
雪    币: 343
活跃值: (611)
能力值: ( LV9,RANK:810 )
在线值:
发帖
回帖
粉丝
6
又是这问题。其实很好解决。先把要移出的位屏蔽掉再移位就没问题了。
2005-8-4 19:37
0
雪    币: 296
活跃值: (250)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
7
最初由 ForEver 发布
又是这问题。其实很好解决。先把要移出的位屏蔽掉再移位就没问题了。

小弟愚钝,可否实例说明?谢过~
2005-8-4 20:06
0
雪    币: 270
活跃值: (312)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
8
我不太懂vb的语句格式,所以我用c来描述,不过没有用到c的符号特性,也没用位操作

DWORD bitmask = 0x80000000;
for (i = 0; i < m; i++) { //m是左移的位数
  if (a >= bitmask) a -= bitmask;
  bitmask = bitmask / 2;
}
for (i = 0; i < m; i++) {
  a = a * 2;
}

//现在a就是结果
2005-8-4 21:46
0
雪    币: 343
活跃值: (611)
能力值: ( LV9,RANK:810 )
在线值:
发帖
回帖
粉丝
9
见下一贴。
2005-8-5 10:35
0
雪    币: 296
活跃值: (250)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
10
最初由 ForEver 发布
给你个例子,编译通过。代码没有优化,只是实现功能。
Function shl(x As Long, cnt As Integer) As Long
Dim tmp As Long
........

多谢ForEver大侠,有些时候有些小问题,刚刚做循环时候碰到:
Label3.Caption = Hex(shl(Format("&H" + "A79C8613"), 2))
做出来是80000000,所以我把
shl = shl and &H20000000
这句去掉了,暂时正常,多谢
2005-8-5 17:15
0
雪    币: 343
活跃值: (611)
能力值: ( LV9,RANK:810 )
在线值:
发帖
回帖
粉丝
11
重新整理了一下。顺便解决你说的问题。
这个是左移位的函数:
x   要移位的数字
cnt 要移位的位数

Function shl(x As Long, cnt As Integer) As Long
Dim tmp As Long
Dim tmp1 As Long
Dim i   As Integer

    If cnt <= 0 Then '如果移位位数小于等于0则返回原来的数
        shl = x
        Exit Function
    End If
   
    If cnt >= 32 Then '如果移位位数大于等于32则返回0
        shl = 0
        Exit Function
    End If
   
    tmp = &H7FFFFFFF \ (2 ^ (cnt - 1)) '取得屏蔽的位数
    tmp1 = tmp - tmp \ 2               '取得要检测的位
    tmp1 = x And tmp1                  '取得该位状态
   
    If tmp1 <> 0 Then
        shl = (x And (tmp \ 2)) * (2 ^ cnt) Or &H80000000 '如果有溢出执行这里
    Else
        shl = (x And tmp) * (2 ^ cnt) '没有溢出执行这里
    End If
      
End Function

转成二进制字符串的函数
Function bin(ByVal x As Long) As String
Dim i As Integer
Dim f As Long

    bin = ""
    f = x And &H80000000
    x = x And &H7FFFFFFF
    For i = 1 To 31
        bin = CStr(x Mod 2) & bin
        x = x \ 2
    Next i
    If f <> 0 Then
        bin = "1" & bin
    Else
        bin = "0" & bin
    End If
   
End Function

我不善于解释,但愿你看代码能看明白我怎么处理溢出的。
2005-8-5 19:27
0
雪    币: 296
活跃值: (250)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
12
有劳ForEver大侠了,那么好的耐心,可否以十六进制运算来说明?
十六进制6379EC3C执行如下操作:
ebp="6379EC3C"
d = Format("&H" + ebp) + Format("&H" + ebp) * 4
Text2.Text = Hex(d)
执行后运算溢出,现在我只要取低八位,在执行时应该怎么判断溢出呢?现在知道溢出1位,是否屏蔽的时候tmp就是1了?还望不吝赐教,谢谢。
2005-8-6 12:08
0
雪    币: 343
活跃值: (611)
能力值: ( LV9,RANK:810 )
在线值:
发帖
回帖
粉丝
13
看不明白你想做什么。如果你只是想取&H6379ec3c的低8位,像这样就可以了。
x = &H6379ec3c
x = x and &Hff
2005-8-6 16:36
0
雪    币: 343
活跃值: (611)
能力值: ( LV9,RANK:810 )
在线值:
发帖
回帖
粉丝
14
另上面我提供的函数你直接使用就可以了
2005-8-6 16:38
0
雪    币: 296
活跃值: (250)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
15
上面几句话写的有点繁琐,大意是将6379EC3C经过如下运算后转换回十六进制。
我是准备计算d=x+x*4,然后得到d的后面八位,但是似乎还是溢出问题。
2005-8-6 16:49
0
雪    币: 296
活跃值: (250)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
16
找到解决方法:
Dim x As String, y As Double, d As Double
x = ""
ebp = "6379EC3C"
d = Format("&H" + ebp) + Format("&H" + ebp) * 4
Do While Not d = 0
x = Hex(d - Int(d / &H10000) * &H10000) & x
d = Int(d / &H10000)
Loop
z = Right$(x, 8)
MsgBox z

多谢programfan论坛的badgas相助,更要谢谢ForEver的耐心指点。
2005-8-6 17:07
0
雪    币: 343
活跃值: (611)
能力值: ( LV9,RANK:810 )
在线值:
发帖
回帖
粉丝
17
其实有更简单的方法。
dim x as long
x = &h6379EC3C
x = x * 5
?hex(x)

这样就可以了。只要你把编译时的整数溢出检查关掉就可以了。
2005-8-6 19:15
0
雪    币: 296
活跃值: (250)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
18
学到不少,有劳了,谢谢
2005-8-6 19:45
0
游客
登录 | 注册 方可回帖
返回
//