【问题标题】:Unexpected value after shifting BigInteger to the left将 BigInteger 向左移动后出现意外值
【发布时间】:2018-07-04 09:41:31
【问题描述】:

我有一个字符串,我通过解析将其转换为 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”是我无法解释的。我尝试了不同的十六进制字符串,但它总是会产生那些额外的位。我做错了什么?

【问题讨论】:

  • FWIW 你的十六进制数乘以 8(左移 3)应该是十六进制“6001056588434436c6172696f6e393530”,即它应该以“600105658...”开头。毕竟,“C”是 12。乘以 8,即 96,或十六进制 60。
  • @RudyVelthuis 是的,它给了 6001056588434436C6172696F6E393530 但如果我用 uint32 测试换档,它给了我 001056..
  • 你为什么要用 uint32 来测试换档?无论如何,我猜在你的测试中 6 溢出了 uint32 的大小,所以你只能看到低 32 位。

标签: vb.net bit biginteger bit-shift


【解决方案1】:
 Dim positiveString As String = "C0020ACB1086886D8C2E4D2DEDC726A6"

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

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

 Dim positiveString As String = "0C0020ACB1086886D8C2E4D2DEDC726A6"

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

【讨论】:

  • 0C 给我 6001056588434436C6172696F6E393530,我想如果没有额外的位就不可能说清楚 001056,所以我认为应该是这样的
  • 应该是60010...,而不是0010...。因此,并非不可能获得0010...(只需使用适当的掩码即可),但这是错误的
猜你喜欢
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多