Che cosa è la funzione inversa di x XOR (x/2)
?Qual'è la funzione inversa di x XOR (x/2)?
Esiste un sistema di regole per la risoluzione delle equazioni, simile all'algebra, ma con operatori logici?
Che cosa è la funzione inversa di x XOR (x/2)
?Qual'è la funzione inversa di x XOR (x/2)?
Esiste un sistema di regole per la risoluzione delle equazioni, simile all'algebra, ma con operatori logici?
Supponiamo di avere un numero x
di N bit. Si potrebbe scrivere questo come:
b(N-1) b(N-2) b(N-3) ... b(0)
dove b(i)
è il numero di bit i
nel numero (dove 0 è il bit meno significativo).
x/2
è lo stesso di x
spostato a sinistra di 1 bit. Assumiamo numeri non firmati. Quindi:
x/2 = 0 b(N-1) b(N-2) ... b(1)
Ora abbiamo XOR x
con x/2
:
x^(x/2) = b(N-1)^0 b(N-2)^b(N-1) b(N-3)^b(N-2) ... b(0)^b(1)
Si noti che il bit più a destra (il bit più significativo) di questo è che è b(N-1)^0
b(N-1)
. In altre parole, è possibile ottenere immediatamente il bit b(N-1)
dal risultato. Quando hai questo bit, puoi calcolare b(N-2)
perché il secondo bit del risultato è b(N-2)^b(N-1)
e sai già b(N-1)
. E così via, è possibile calcolare tutti i bit b(N-1)
a b(0)
del numero originale x
.
ti posso dare un algoritmo in bit:
Supponendo di avere un array di n bit:
b = [b1 .. bn] // b1-bn are 0 or 1
La matrice originale è:
x0 = b0
x1 = b1^x0
x2 = b2^x1
o in generale
x[i] = b[i]^x[i-1]
Assum e Y = X^(X/2)
Se si vuole trovare X, fare questo
X = 0
do
X ^= Y
Y /= 2
while Y != 0
Spero che aiuta!
So che è un argomento vecchio, ma mi sono imbattuto nella stessa domanda, e ho scoperto un piccolo trucco. Se si dispone n bit, invece di richiedere n bit operazioni (come la risposta di Jesper), è possibile farlo con log2 (n) numero operazioni:
Supponiamo che y sia pari a x XOR (x/2) all'inizio del programma, si può fare il seguente programma C:
INPUT : y
int i, x;
x = y;
for (i = 1; i < n; i <<= 1)
x ^= x >> i;
OUTPUT : x
e qui si ha la soluzione.
Perché funziona? Prendiamo come esempio n = 5 bit, e iniziano con y = b4 b3 b2 b1 b0 (in binario: nella seguente x è scritto in binario anche, ma è scritto in decimale)
x = b4 b3 b2 b1 b0
x >> 1 = b4 b3 b2 b1 quindi abbiamo x = b4 b3 b2 b1 b0 XOR b3 b2 b1 b0 = b4 (b3^b4) (b2^b3) (b1^b2) (b0^b1)
x >> 2 = b4 (b3^b4) (b2^b3) quindi abbiamo x = b4 (b3^b4) (b2^b3) (b1^b2) (b0^b1) XOR b4 (b3^b4) (b2^b3) = b4 (b3^b4) (b2^b3^b4) (b1^b2^b3^b4) (b0^b1^b2^b3)
x >> 4 = b4 quindi abbiamo x = b4 (b3^b4) (b2^b3^b4) (b1^b2^b3^b4) (b0^b1^b2^b3) XOR b4 = b4 (b3^b4) (b2^b3^b4) (b1^b2^b3^b4) (b0^b1^b2^b3^b4)
E abbiamo l'output desiderato.
Il ciclo ha iterazioni log2 (n) perché inizio a 1 e viene moltiplicato per 2 ad ogni passaggio, quindi per i n raggiungere, dobbiamo farlo log2 (n) volte.
C o Python? Ma potresti voler provare qualcosa di più matematico come l'acero o il matlab ... altrimenti sarà piuttosto difficile – ThiefMaster
L'espressione è la stessa in entrambe le lingue - non importa. – fadedbee
Ah, ho pensato di voler calcolare il contrario di una funzione arbitraria – ThiefMaster