Неожиданное значение после смещения BigInteger влево - PullRequest
0 голосов
/ 04 июля 2018

У меня есть строка, которую я преобразовываю в 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 голосов
/ 04 июля 2018
 Dim positiveString As String = "C0020ACB1086886D8C2E4D2DEDC726A6"

На самом деле это не очень хорошо, это легко увидеть с помощью отладчика. Предположительно, вы видели это. Этот шестнадцатеричный литерал имеет бит знака, C = 1100 в двоичном виде. Знаковый бит является наиболее значимым битом в значении, первым 1 в 1100. Этот бит не участвует в значении иным образом, он только указывает знак.

Сделать это положительным, то есть отключить знак, легко. Исправлено:

 Dim positiveString As String = "0C0020ACB1086886D8C2E4D2DEDC726A6"

Подробнее о кодировке дополнения до двух, стандартном способе, которым сегодня процессоры кодируют отрицательные числа, доступно здесь .

...