将 BigInteger 向左移动后出现意外值
Unexpected value after shifting BigInteger to the left
我有一个字符串,我通过解析将其转换为 BigInteger,然后将其向左移动 3 位,然后再次转换为字符串。问题是它总是在实际值之前输出额外的位。例如:
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
Dim positiveString As String = "C0020ACB1086886D8C2E4D2DEDC726A6"
Dim posBigInt As BigInteger = 0
posBigInt = BigInteger.Parse(positiveString, System.Globalization.NumberStyles.AllowHexSpecifier)
posBigInt = posBigInt << Hex(3)
RichTextBox1.Text = posBigInt.ToString("X")
End Sub
- 给我:E001056588434436C6172696F6E393530 - 这是不正确的
- 前 4 个字节应该是:00105658(我无法检查整个数组
因为我不知道除了 BigInteger 之外的其他方法,
使用 UInt64)
检查
值前面的"E"是我无法解释的。我尝试了不同的十六进制字符串,但它总是会产生那些额外的位。我做错了什么?
Dim positiveString As String = "C0020ACB1086886D8C2E4D2DEDC726A6"
实际上不是肯定的,用调试器很容易看出来。想必你看到了。该十六进制文字的符号位已打开,二进制 C = 1100。符号位是值中的最高位,1100 中的第一个 1。该位不参与值,它仅表示符号。
使其为正,即关闭符号位,很容易做到。修正:
Dim positiveString As String = "0C0020ACB1086886D8C2E4D2DEDC726A6"
有关二进制补码编码(当今处理器对负数进行编码的标准方式)的更多信息是 available here。
我有一个字符串,我通过解析将其转换为 BigInteger,然后将其向左移动 3 位,然后再次转换为字符串。问题是它总是在实际值之前输出额外的位。例如:
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
Dim positiveString As String = "C0020ACB1086886D8C2E4D2DEDC726A6"
Dim posBigInt As BigInteger = 0
posBigInt = BigInteger.Parse(positiveString, System.Globalization.NumberStyles.AllowHexSpecifier)
posBigInt = posBigInt << Hex(3)
RichTextBox1.Text = posBigInt.ToString("X")
End Sub
- 给我:E001056588434436C6172696F6E393530 - 这是不正确的
- 前 4 个字节应该是:00105658(我无法检查整个数组 因为我不知道除了 BigInteger 之外的其他方法, 使用 UInt64) 检查
值前面的"E"是我无法解释的。我尝试了不同的十六进制字符串,但它总是会产生那些额外的位。我做错了什么?
Dim positiveString As String = "C0020ACB1086886D8C2E4D2DEDC726A6"
实际上不是肯定的,用调试器很容易看出来。想必你看到了。该十六进制文字的符号位已打开,二进制 C = 1100。符号位是值中的最高位,1100 中的第一个 1。该位不参与值,它仅表示符号。
使其为正,即关闭符号位,很容易做到。修正:
Dim positiveString As String = "0C0020ACB1086886D8C2E4D2DEDC726A6"
有关二进制补码编码(当今处理器对负数进行编码的标准方式)的更多信息是 available here。