Предположим, с шагом (1 - ((((x + 1) >> 31) + x + 1) >> 16))
, x
преобразованным в y
, получаем:
y = 1 - ((((x + 1) >> 31) + x + 1) >> 16)
1 - y = (((x + 1) >> 31) + x + 1) >> 16
(1 - y) << 16 = (x + 1) >> 31 + x + 1
Если x
<= 0, то <code>x + 1 <=1. Однако это не может решить бит знака.Таким образом, мы должны предположить еще раз. </p>
, если x + 1
<0, то <code>(x + 1) >> 31 равно -1, что x
<-1, <code>y, что 1 - ((((x + 1) >> 31) + x + 1) >> 16)
, равно 1 - (x >> 16)
(1 - y) << 16 = -1 + x + 1
(1 - y) << 16 = x
если x + 1
> = 0, то (x + 1) >> 31
равно 0, что x
> = -1, а y
, что составляет 1 - ((((x + 1) >> 31) + x + 1) >> 16)
, равно 1. (Примечание: теперь x может быть только 0 или -1 )
(1 - y) << 16 = x + 1
(1 - y) << 16 - 1 = x
Итак, включив эти два результата вместе, мы можем получить:
int reverse_convert(int64_t y) {
if (y == 1)
return (1 - y) << 16 - 1; // However, either x = 0 or x = 1 can produce this result.
else
return (1 - y) << 16;
// the condition of y == 0, corresponding to the original "else return 0;", is ignored.
}
Кроме того, convert
функция - это только для сюръективной функции , что означает, что несколько входов могут получить один и тот же выход, и тогда невозможно обратить точный выходной сигнал на вход.