Jer*_*ome 6 vbscript bit-manipulation bit-shift
我必须实现校验和(CRC16 CCITT)来验证文件的内容.由于<<和>>运算符以及网上提供的许多示例,校验和在C或Java中实现起来相当简单.
问题是......我的校验和计算必须在VBScript中实现.
我对这种语言的体验几乎是无效的,但根据我的理解,在VBScript中没有提供任何改变.因此,我依靠乘法和除法两个.除负值外,它运行良好.
我运行了几个测试,我相信VBScript用两个补码来处理它的16位整数.
Q1:有人可以证实这一点(VBScript中的两个补码)吗?我没有从MSDN网站上找到任何准确的信息.
Q2:当负数用二进制补码编码时,是否可以通过简单的数学运算进行位移(左右)?
.
非常感谢,我真的想避免使用像整数作为'1'和'0'的数组或从VBScript调用一些java/c应用程序的kludge.
编辑感谢您的帮助,请在下面找到我在VBScript中右移的实现:
Function rightShift(value,bits)
Dim res
res = 65535 AND value
If value>=0 Then
res = res \ (2^bits)
Else If value=-1 Then
res = rightShift(res + 32768, bits - 1)
Else
res = rightShift(value \ 2 + 32768, bits - 1)
End If
End If
rightShift = res AND 65535
End Function
Run Code Online (Sandbox Code Playgroud)
关于上面的代码的注意事项:值有时超过16位,因此我必须屏蔽未使用的位以避免overflow(AND 65535).
在二进制补码算法中,除以2向右移动时出现负值的唯一影响:预期的右移将发生,但它也会在最高有效位(MSB)位置引入新的1位"保持值为负" - 除非原始值为-1,在这种情况下所有位都变为0.因此要纠正此问题,请尝试以下伪代码:
rightshift(x) {
if x >= 0 return x / 2;
if x < -1 return x / 2 - MINVAL; # Strip out sign bit
# x must be -1, i.e. "all bits on"
return x - MINVAL;
}
Run Code Online (Sandbox Code Playgroud)
MINVAL应该是其表示仅包含MSB on和所有其他位off的值,对于16位是-32768.(之所以这么命名是因为它将是使用二进制补码的最负的可表示数字.)有趣的是,加法的MINVAL工作方式与在上面的伪代码中减去它一样,因为在二进制补码算法中,x - y= x + NOT(y) + 1和MINVAL == NOT(MINVAL) + 1.
左移使用乘法2对负数进行左移,就像对正数进行左移一样.