For i=1 to N
SaveHi = Myb(0) '保存高位,是为了判断右移时是否向低位字节进1
SaveLo= Myb(1) '保存低位,是为了循环移位,如果末尾移出了1
'以下是右移'''''''''''''''''''''''''''''''''''''
Myb(0) = Myb(0) \ 2 '右移不会溢出的
Myb(1)= Myb(1) \ 2
If ((SaveHi And &H1) = &H1) Then
Myb(1) = Myb(1) Or &H80
End If
If ((SaveLo And &H1) = &H1) Then
//这个判断就是用来判断是否移出了1,如果移出一,则最高位补一个1
Myb(0)= Myb(0) or &H80
End if
Next
这题我会解!
第一步,先把整形变量数(有正有负)转化为2进制数存放在一个Byte(0 to 1)中
Dim MyB(1) as byte
if N>=0 then
Myb(0)= N \ 256 //高位
Myb(1)= N mod 256 //低位
else
tmp=N*(-1)
Myb(0)= tmp \256
Myb(1)= tmp mod 256
Myb(0)= Not(Myb(0) and &H80) //将符号位取反
Myb(1)= Not(Myb(1)) +1
//以上两行是先求出正数N的二进制表示方法,然后把最高位置1(这样就是-N的原码了)
//然后把所有位都取反,末尾+1,这样就是-N的补码形式了,在计算机中负数是补码来存放的。
end if
转化好以后就是移位操作了,意味操作代码如下(假定你要移动N位)
For i=1 to N
SaveHi = Myb(0) '保存高位,是为了判断右移时是否向低位字节进1
'以下是右移'''''''''''''''''''''''''''''''''''''
Myb(0) = Myb(0) \ 2 '右移不会溢出的
Myb(1)= Myb(1) \ 2
If ((SaveHi And &H1) = &H1) Then
Myb(1) = Myb(1) Or &H80
End If
Next
如果是左移,也是一样:
For i=1 to N
SaveLo = Myb(1) '保存低位,是为了判断左移时是否向高位字节进1
'以下是右移'''''''''''''''''''''''''''''''''''''
Myb(0) = (Myb(0) * 2) mod &HFF '要取余,不然会溢出
Myb(1) = (Myb(1) * 2) mod &HFF
If ((SaveLo And &H80) = &H1) Then
Myb(0) = Myb(0) Or &H01 '高位进一
End If
Next