vb能够像汇编那样,对一个字节进行拆分、左右移位、与、或、非、异或吗?我到这里不是为了争分。只是觉得这里有很
vb能够像汇编那样,对一个字节进行拆分、左右移位、与、或、非、异或吗? 我到这里不是为了争分。只是觉得这里有很多热情的、专业的、称职的老师。 所以这两天连着问问题。在这里问比在msdn上查还有针对性。 vb能够像汇编那样,对一个字节进行拆分(高四位、低四位)、对一个字节进行左、右移位、与、或、非、异或吗? 先谢谢了![解决办法] And &HF0 '取高4位 And &H0F '取低4位 * 2 '左移1位 \ 2 '右移1位 And '与 OR '或 Not '非 Xor '异或 这些都是基础知识[解决办法] 能够拆分出高4位、低四位: C8h ----> H = &HC8 \ 16 L = &HC8 And 15 移位: 只有用乘除法来间接实现,因为存在溢出问题,相对麻烦些。 但你说只对一个字节进行移位,那就没问题了。用Long变量来做中介,没任何麻烦。 右移,用除法: C8h >> 3 ----> &HC8 \ 8 左移,用乘法: C8h << 2 ----> (&HC8 * 4) And &Hff 与、或、非、异或: 与 And ----> &HC8 And 15 (= 8) 或 Or ----> &HC8 Or 15 (= &HCF) 非 Not Dim bNum As Byte bNum = &HC8 bNum = Not bNum (bNum = &H37) 异或 Xor ----> &HC8 Xor &H63 ( = &HAB)[解决办法] 也许像我这样按部就班学东西的人不适合现在这个时代了吧? 不过,如果你要写的东西要用于实际产品的话,建议还是认真看一下MSDN的程序员手册的Part One,讲得很基础。如果什么都不懂,就拷贝一些勉强理解了的代码到产品里去,总觉得对产品不够负责。[解决办法] 只能用乘除法做位移,没别的办法了 用乘法实现左移可能导致溢出 可以设置工程属性,在优化里面选中“取消整数溢出检查”[解决办法] 对于左移,右移VB没有直接的指令实现,Delphi有[解决办法]
引用: slowgrace感谢你的教诲。我知道有我们在这里讨论的功夫,如果按照上面人的热心指点我也试出来了。 我只是想看一下高手们写的漂亮语句和高手处理问题的思维方式。另外,我只是一年使用一两次vb,和软件高手们的确差得太远。我到现在还没有感觉到主动和高手学习点经验有什莫不对。另外,vb里除了\2 和×2就没有别的招了吗?类似于 rol a ror a 的语句吗。 这两天有点烦,不想自己试了。如果这里实在没人出手。那天我有时间,一定按照你的意思和上面的人的指点去做实验。 多谢! 写个 过程/函数 就很难吗?楼主何必为自己的懒找借口呢!
这么点功能都要用控件?真不知道楼主在怎么想。
你不就是要对 字节 进行移位操作吗,简单得很,给你段代码看看吧:
Option Explicit ' Byte 左移位 Private Sub rol(n As Byte, Optional ByVal bit As Long = 1) If (bit < 0) Then Err.Clear: Err.Raise 6 If (bit > 7) Then n = 0 Else n = CLng(n) * 2& ^ bit And 255 End If End Sub ' Byte 右移位 Private Sub ror(n As Byte, Optional ByVal bit As Long = 1) If (bit < 0) Then Err.Clear: Err.Raise 6 If (bit > 7) Then n = 0 Else n = CLng(n) \ 2& ^ bit End If End Sub Private Sub Command1_Click() ' 测试代码: Dim a As Byte a = 13: Cls rol a: Print a rol a, 4: Print a ror a: Print a ror a, 3: Print a ror a, 100: Print a End Sub
[解决办法] 引用: 我在上面的程序试了一下: ? 1 左移 10次 等于 400 (如果是16进制则=1024 正确) ? 24 左移两次 等于 90? 好像不对了吧! 那位给指导一下! 谢谢! 1024 已经不是 Byte类型数据 能表示的了,如果仅限于 Byte类型的 移位,我在 15F 的代码足够用。
[解决办法] 引用: 这个贴子不白顶 第一次知道VB还有eqv imp这两个运算符 得琢磨琢磨在哪里能用上这两的东东 eqv 即逻辑代数中的所谓“同或”,即 对应位相同则为1,不同则为0,与 Xor(“异或”)刚好相反,
eqv <-> Not(Xor)
imp 是所谓的逻辑“蕴涵”,以前在逻辑代数里看过,但时间太久了,都忘了。刚才看了一下 VB 文档里对此操作符的说明,应该是这样:
Oprand1 imp Oprand2
0<->0
1<->1
Null<->Null
0 ->Null->1
这里,0 与False对应,1与True对应;Oprand1->Oprand2表示Oprand1蕴涵于Oprand2,Oprand1<->Oprand2表示Oprand1与Oprand2彼此蕴涵,即相等。
如果用True和False来写上面的几个蕴涵关系式,则为
False<->False
True<->True
Null<->Null
False->Null->True
如果其中一个操作数为Null,而蕴涵关系不成立(即不是上面的任何一种情况,因而结果不为True),则结果为Null,其它情况结果都为 True/False。
各位可对照开发文档和真值表来进行验证。
[解决办法] 用乘法实现左移可能导致溢出
可以设置工程属性,在优化里面选中“取消整数溢出检查”
=====================================================================================
溢出是可以预防的:
a = (a And &H7F) * 2
a = (a And &H3F) * 4
......
[解决办法] 引用: 用乘法实现左移可能导致溢出 可以设置工程属性,在优化里面选中“取消整数溢出检查” ===================================================================================== 溢出是可以预防的: a = (a And &H7F) * 2 a = (a And &H3F) * 4 ...... 如果 a 是 Integer类型的数据:
当 a≥ 16384 时,(a And &H7F) * 2 就溢出了。
当 a≥ 8192 时, (a And &H7F) * 4 就溢出了。
[解决办法] 另外,不解的是“当 a≥ 16384 时,(a And &H7F) * 2 就溢出了。”是如何溢出的。
16384 And &H7F = 0
0 * 2 = 0
8192 And &H3F = 0
0 * 4 = 0