Я хочу выполнить вычитание, используя только двоичные операции, но следующий код не работает.
Проблема, похоже, заключается в том, как я обрабатываю перенос для следующей позиции, но не могу сделать это правильно.
private static long subtract(long x, long y) {
long result = 0;
long index = 1;
long carryIn = 0;
long xShift = x, yShift = y;
while(xShift != 0 || yShift != 0) {
long xIndex = x & index;
long yIndex = y & index;
long carryOut = (yIndex > xIndex || (xIndex == yIndex && carryIn != 0))? 1 : 0;
result |= xIndex ^ yIndex ^ carryIn;
carryIn = carryOut << 1;
index <<= 1;
xShift >>>= 1;
yShift >>>= 1;
}
return result | carryIn;
}
Это дает subtract(8, 2)
как 10, потому что я не могу отменить бит в 3-й позиции должным образом.
Что я делаю неправильно и как я могу это исправить?