当没有...位移操作符时位移

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).

j_r*_*ker 5

在二进制补码算法中,除以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) + 1MINVAL == NOT(MINVAL) + 1.

左移使用乘法2对负数进行左移,就像对正数进行左移一样.