gpt4 book ai didi

vbscript - 没有 ... 移位运算符时的移位

转载 作者:行者123 更新时间:2023-12-04 15:25:37 25 4
gpt4 key购买 nike

我必须实现一个校验和(CRC16 CCITT)来验证文件的内容。
由于 << 和 >> 运算符以及网络上提供的许多示例,校验和在 C 或 Java 中实现起来相当简单。

问题是……我的校验和计算必须在 VBScript 中实现。

我对这种语言的经验几乎为零,但据我所知,在 VBScript 中没有提供任何内容来进行位移。所以我靠乘以和除以二。 除了 外,它运行良好负值 .

我进行了一些测试,我相信 VBScript 使用二进制补码处理其 16 位整数。

Q1:有人可以向我证实这一点(VBScript 中的二进制补码)吗?我没有从 MSDN 网站上找到任何准确的信息。

Q2:当负数用二进制补码编码时,是否可以通过简单的数学运算进行位移(左右)?

.

非常感谢,我真的很想避免像将整数处理为“1”和“0”数组或从 VBScript 调用一些 java/c 应用程序之类的麻烦事。

编辑 感谢您的帮助,请在下面找到我在 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

请注意上面的代码:值有时会超过 16 位,因此我必须屏蔽未使用的位以避免溢出( 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;
}
MINVAL应该是表示仅由 MSB 打开而所有其他位关闭的值,对于 16 位,它是 -32768。 (如此命名是因为它将是使用二进制补码的最负可表示数。)有趣的是,添加 MINVAL与在上面的伪代码中减去它一样有效,因为在二进制补码算法中, x - y = x + NOT(y) + 1 , 和 MINVAL == NOT(MINVAL) + 1 .

使用乘以 2 的左移适用于负数,就像它们适用于正数一样。

关于vbscript - 没有 ... 移位运算符时的移位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10378246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com