将BigInteger左移后出现意外值

时间:2018-07-04 09:41:32

标签: 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 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”是我无法解释的。我尝试了不同的十六进制字符串,但是它总是产生那些额外的位。我在做什么错了?

1 个答案:

答案 0 :(得分:5)

List<ProductInCategory> unCategorize = await _context.ProductsInCategories
    .Where(pic => products.Select(p => p.Id).Contains(pic.ProductId)
        && pic.ProductCategoryId == secondary_id)
    .ToListAsync();

实际上不是肯定的,可以通过调试器轻松查看。想必您看到了。该十六进制文字的符号位已打开,C = 1100(二进制)。符号位是值中的最高有效位,即1100中的第一个1。否则,该位不参与值,仅指示符号。

很容易做到这一点,即关闭符号位。修复:

 Dim positiveString As String = "C0020ACB1086886D8C2E4D2DEDC726A6"

关于二进制补码(当今处理器对负数进行编码的标准方式)的更多信息是available here