Как правильно заполнить отрицательные двоичные числа? - PullRequest
0 голосов
/ 12 февраля 2020

Он отлично работает с положительными числами, и я знаю, что мог бы просто вручную обрезать первые две группы единиц, чтобы исправить проблему, но будет ли более оптимальный способ сделать это? Пример кода выводится в 32 битах вместо указанных 24 бит:

var s = Convert.ToString(-3, 2).PadLeft(24, '0');
Console.WriteLine(s);
//Expected: 1111 1111 1111 1111 1111 1101
//Actual: 1111 1111 1111 1111 1111 1111 1111 1101

1 Ответ

1 голос
/ 12 февраля 2020

PadLeft применяет минимальную длину к строке, но вы хотите, чтобы ваша строка имела длину ровно 24 символов.

Таким образом, в дополнение к PadLeft, вам также необходимо использовать Substring для усечения вашей строки, когда она содержит более 24 символов:

string s = Convert.ToString(-3, 2);
// assuming the int is always representable by 24 bits two's complement
if (s.Length < 24) { // alternatively, check integer is positive
    s = s.PadLeft(24, '0');
} else if (s.Length > 24) { // alternatively, check integer is negative
    s = s.Substring(8);
}

Как сказал Ганс Пассант в комментариях, вы также можете использовать битовую маску для очистите наиболее значимые 8 бит числа, которое вы конвертируете Таким образом, вам не нужны операторы if.

Convert.ToString(-3 & 0xffffff, 2).PadLeft(24, '0');
...