首页 > 解决方案 > 将 BigInteger 向左移动后出现意外值

问题描述

我有一个字符串,我通过解析将其转换为 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

值之前的“E”是我无法解释的。我尝试了不同的十六进制字符串,但它总是会产生那些额外的位。我究竟做错了什么?

标签: vb.netbitbigintegerbit-shift

解决方案


 Dim positiveString As String = "C0020ACB1086886D8C2E4D2DEDC726A6"

它实际上并不积极,使用调试器很容易看到。想必你看到了。该十六进制文字已打开符号位,C = 1100 二进制。符号位是值中的最高有效位,即 1100 中的第一个 1。该位不参与该值,它仅表示符号。

使其为正,即关闭符号位,很容易做到。使固定:

 Dim positiveString As String = "0C0020ACB1086886D8C2E4D2DEDC726A6"

有关二进制补码编码(当今处理器编码负数的标准方式)的更多信息,请参见此处


推荐阅读