2012-03-24 11 views
6

Sto calcolando XOR di due short integers utilizzando l'operatore XOR ^ in modo tradizionale. Di seguito è riportato il metodo-XOR di due interi brevi

short a=197; 
short b=341; 
short y = (short) (a^b); 

Tuttavia lo XOR sempre restituito intero ma nel mio caso sono ingressi intero breve, è per questo che sto per scacciare breve per l'uscita XOR. Lo XOR può essere calcolato in diversi modi (esempio: usando BigInteger ecc.) Ma in termini di prestazioni (meno tempo) che è il migliore per gli interi brevi? Tenendo a mente le prestazioni, dovrei prima convertire ogni numero intero breve in numero binario usando Integer.toBinaryString(number) quindi applicare XOR bit a bit?

risposta

8
short s1 = ... 
short s2 = ... 
short result = (short) (s1^s2); 

Questo è il modo più efficace per XOR due short s insieme. Non si verifica l'overhead della creazione di BigInteger s e il cast non causerà mai un problema di overflow poiché entrambi s1 e s2 sono short s per iniziare.

4

Non è molto chiaro cosa intendi per "convertire ogni numero intero breve in numero binario" - un corto è già un numero, e la sua rappresentazione è naturalmente binaria.

si desidera solo:

short x = ...; 
short y = ...; 
short z = (short) (x^y); 

è necessario il cast come x^y promuoverà sia per int, e il risultato sarà un int. Tuttavia, il risultato dovrà essere compreso nell'intervallo short, quindi è possibile eseguire questo cast senza perdere informazioni.

Vedere section 15.22.1 of the JLS per ulteriori informazioni su XOR in particolare e section 5.6.2 per informazioni sulla promozione numerica binaria in generale.

+0

@EricJ .: stavi ancora guardando la versione in cui non avevo parentesi attorno a '(x^y)'? Ho risolto un po 'di tempo fa :) –

+0

Sì, vedo l'aggiornamento. Ritirare il commento :-) –

+0

@JonSkeet: Per "" convertire ogni intero breve in numero binario "" intendevo che dovevo prima convertire ogni intero breve in una stringa binaria usando 'Integer.toBinaryString (numero)' quindi applica 'bitwise XOR' ? –

1

sono sicuro al 100% quello che stai chiedendo, ma spero che questo aiuta:

Java costringe entrambi gli operandi di tipo int. Questo è il motivo per cui il risultato è un int.

http://java.comsci.us/syntax/expression/bitwisexor.html

in modo che le corti saranno automaticamente convertiti in un int, e l'operazione XOR saranno fatte in modo molto efficiente sui operandi interi.

Se uno degli operandi è lungo, entrambi i tipi sono invece forzati a un valore lungo. Tuttavia, ciò non si applica nel tuo caso.

Linea di fondo, dato che entrambi gli ingressi sono brevi, se avete bisogno di una breve risultato, la cosa più efficace da fare è

short result = (short) (operandA^operandB); 
Problemi correlati