2013-04-30 22 views
7

Czy istnieje korzyść z używania czystych operacji bitowych (& |^~) w przypadku używania BigInteger (BigInteger.and BigInteger.or) dla operacji bitowych pod względem wydajności? pamięć? coś jeszcze?Operacja bitowa Java Vs BigInteger

Używam BigInteger do operacji bitowych, ponieważ wynikowy kod jest znacznie bardziej czytelny.

przykład kodu, który będę używał:

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

nie musisz konwertować na BigInteger? –

+0

Nie, operacje są wykonywane między małymi numerami (maks. 2^10) w celu maskowania. –

+0

To znaczy, fakt, że nie musisz tworzyć nowego obiektu BigInteger lub dwóch, jest prawdopodobnie bardzo dużym bonusem wydajności. –

Odpowiedz

7

To jest zawsze bardziej efektywne, aby pracować z prymitywów zarówno pod względem wydajności i pamięci. Ale BigInteger może pracować z liczbami większymi niż int i długim. Np.

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

czy możesz podać przypadek operacji bitowych na liczbie większej niż długa? –

+1

łatwe, patrz aktualizacja –

+1

Myślę, że Noam poprosił o przypadek użycia, a nie jak go wdrożyć. Obsługa masek podsieci dla adresów IPv6 (128 bitów) byłaby jedna. – jarnbjo