2013-04-30 8 views
7

Esiste un vantaggio dell'utilizzo di operazioni bit per bit semplici (& |^~) rispetto all'utilizzo di BigInteger (BigInteger.and BigInteger.or) per operazioni bit a bit in termini di prestazioni? memoria? qualunque altra cosa?Operazione bit a bit Java Vs BigInteger

Per l'utilizzo di BigInteger per operazioni bit a bit poiché il codice risultante è molto più leggibile.

esempio per il codice che userò:

BigInteger bNum1 = new BigInteger("0"); 
BigInteger bNum2 = new BigInteger("0"); 
BigInteger bNum3 = new BigInteger("0"); 
bNum1 = bNum1.setBit(0); 
bNum2 = bNum2.setBit(1); 
bNum3 = bNum3.setBit(2); 

BigInteger bMask = bNum3.or(bNum1); 

System.out.println(bMask.and(bNum1).equals(bMask)); 
System.out.println(bMask.and(bNum2).equals(bMask)); 
System.out.println(bMask.and(bNum3).equals(bMask)); 
System.out.println(bMask.and(bMask).equals(bMask)); 


int num1 = 1 << 0; 
int num2 = 1 << 1; 
int num3 = 1 << 2; 

int mask = num3 | num1; 

System.out.println((mask & num1) == mask); 
System.out.println((mask & num2) == mask); 
System.out.println((mask & num3) == mask); 
System.out.println((mask & mask) == mask); 
+0

non è necessario convertire in BigInteger? –

+0

no, le operazioni sono tra numeri piccoli (max 2^10) per scopi di mascheramento –

+0

Voglio dire, il fatto che non devi creare un nuovo oggetto BigInteger o due è probabilmente un bonus di prestazioni piuttosto grande. –

risposta

7

È sempre più efficiente per lavorare con primitive sia in termini di prestazioni e memoria. Ma BigInteger può funzionare con numeri più grandi di int e long. Per esempio

BigInteger b1 = new BigInteger("1111111111111111111111111111111111111111111111111"); 
BigInteger b2 = new BigInteger("2222222222222222222222222222222222222222222222222"); 
BigInteger b3 = b1.and(b2); 
+0

puoi dare un caso d'uso di operazioni bit a bit su un numero più grande di lungo? –

+1

facile, vedi aggiornamento –

+1

Penso che Noam abbia chiesto un caso d'uso e non come implementarlo. Gestire le subnet mask per gli indirizzi IPv6 (128 bit) sarebbe uno. – jarnbjo