Для того, чтобы преобразовать свое дополнение в дополнение к двум, вам нужно будет проверить, является ли это число положительным или отрицательным первым.
Поскольку положительное представление двух дополнений эквивалентно представлению одного дополнения, вам нужно будет выполнить преобразование, только если ваше дополнение является отрицательным.
Фактическое преобразование выполняется путем принятия абсолютного значения его дополнения, переворачивания всех битов, а затем увеличения результата на единицу.
if (myLong >> 63 != 0) // The last bit is not 0, meaning myLong is negative
{
myLong = (myLong & (long.MaxValue >> 1)); // sets the leading bit to 0, making myLong positive
myLong = ~myLong + 1; // flips all bits and increments by 1
}
return myLong;
// One-liner alternative
return myLong >> 63 != 0 ? (~(myLong & (long.MaxValue >> 1))) + 1 : myLong;
Я подозреваю, что ваше дополнение хранится как «строка»? – Nolonar
@Nolonar: я понимаю, что интегральное представление двойника лексиографически упорядочено, если рассматривать его как номер дополнения. Таким образом, я хотел бы преобразовать это представление с одним дополнением в значение двойного дополнения, чтобы я мог работать с ним как C# long – ChaseMedallion
К сожалению, я не знаю, хранятся ли поплавки или удваиваются в дополнении, но я знаю что целое (и длинное) хранится как дополнение к двум, так как это делает добавление между положительным и отрицательным числом намного проще. В крайнем случае вы всегда можете преобразовать свое дополнение, посмотрев, является ли самый старший бит «1». Если это так, вы устанавливаете его на '0', инвертируете все биты' ~ ', а затем увеличиваете результат на единицу. Если самый старший бит был '0', у вас уже есть дополнение к двум (как оба эквивалентны, когда положительные) – Nolonar