Vb.net 将BigInteger向左移动后出现意外值

Vb.net 将BigInteger向左移动后出现意外值,vb.net,bit,biginteger,bit-shift,Vb.net,Bit,Biginteger,Bit Shift,我有一个字符串,我正在通过解析将其转换为BigInteger,然后向左移动3位,再次转换为字符串。问题是它总是在实际值之前输出额外的位。例如: Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click Dim positiveString As String = "C0020ACB1086886D8C2E4D2DEDC726A6" Dim posBigInt

我有一个字符串,我正在通过解析将其转换为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
Private子按钮4\u单击(发送者作为对象,e作为事件参数)处理按钮4。单击
变暗正极字符串=“C0020ACB1086886D8C2E4D2DEDC726A6”
Dim posBigInt作为BigInteger=0
posBigInt=biginger.Parse(positiveString、System.Globalization.NumberStyles.allowehexspecifier)
posBigInt=posBigInt
它实际上不是正面的,使用调试器很容易看到。大概你看到了。该十六进制文字的符号位已打开,二进制中的C=1100。符号位是值中的最高有效位,1100中的第一个1。该位不参与值,它只指示符号

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

 Dim positiveString As String = "0C0020ACB1086886D8C2E4D2DEDC726A6"
更多关于二的补码编码,处理器编码负数的标准方式,是

它实际上不是正面的,使用调试器很容易看到。大概你看到了。该十六进制文字的符号位已打开,二进制中的C=1100。符号位是值中的最高有效位,1100中的第一个1。该位不参与值,它只指示符号

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

 Dim positiveString As String = "0C0020ACB1086886D8C2E4D2DEDC726A6"

关于二的补码编码的更多信息,处理器现在编码负数的标准方式是。

FWIW您的十六进制数乘以8(左移3)应该是十六进制“6001056588434436c6172696f6e393530”,即它应该以“600105658…”开头。毕竟,“C”是12。乘以8,即96,或十六进制60。@RudyVelthuis是的,它给出6001056588434436C61726966F6E393530,但如果我用uint32测试换档,它给出001056。你为什么要用uint32测试换档?无论如何,我猜在您的测试中,6溢出了uint32的大小,因此您只能看到低32位。FWIW您的十六进制数乘以8(左移3)应该是十六进制“6001056588434436c6172696f6e393530”,即它应该以“600105658…”开头。毕竟,“C”是12。乘以8,即96,或十六进制60。@RudyVelthuis是的,它给出6001056588434436C61726966F6E393530,但如果我用uint32测试换档,它给出001056。你为什么要用uint32测试换档?无论如何,我猜在你的测试中,6溢出了uint32的大小,所以你只看到低32位。0C给我6001056588434436C6172696F6E393530,我猜如果没有额外的位,就不可能清楚001056,所以我想应该是这样的它应该是
60010…
,而不是
0010…
。所以要得到
0010…
(只要有一个合适的掩码,你就知道了),这并不是不可能的。0C给了我6001056588434436C6172696F6E393530,我想如果没有额外的位,就不可能清楚001056,所以我认为应该是这样的它应该是
60010…
,而不是
0010…
。因此,获得
0010…
(只需使用适当的掩码,您就可以获得),但这是错误的。