В двоичном коде
x y | x-y
--- --- ---
0 0 | 0
0 1 | 1 (with a borrow)
1 0 | 1
1 1 | 0
, то есть
x y | x-y
--- --- ---------------
0 0 | 0 - ( 0 << 1 )
0 1 | 1 - ( 1 << 1 )
1 0 | 1 - ( 0 << 1 )
1 1 | 0 - ( 0 << 1 )
Это означает, что
x - y
эквивалентно
( x ^ y ) - ( ( (~x) & y ) << 1 )
потому что результат вычитания может быть дан как x ^ y
x y | x^y
--- --- ---
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 0
, а сумма заимствования может быть дана как (~x) & y
x y | (~x) & y
--- --- --------
0 0 | 0
0 1 | 1
1 0 | 0
1 1 | 0
Проверка того, что происходит (положительное и отрицательное) переполнение оставлено на усмотрение пользователя.