Вычитание в двоичном виде и как обрабатывать перенос - PullRequest
0 голосов
/ 24 апреля 2020

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

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-й позиции должным образом.
Что я делаю неправильно и как я могу это исправить?

...