2013-04-30 207 views
7

在性能方面,使用純粹的按位運算(& |^~)與使用BigInteger(BigInteger.and BigInteger.or)進行按位運算相比,是否有優勢?記憶?還要別的嗎?Java按位運算與BigInteger

因爲我使用BigInteger進行按位操作,因爲生成的代碼更可讀。爲此,我將使用代碼

例如:

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

您不必轉換爲BigInteger? – 2013-04-30 08:24:29

+0

不,操作在小數字(最大2^10)之間用於掩蓋目的 – 2013-04-30 08:25:11

+0

我的意思是,您不必創建新的BigInteger對象或兩個對象可能是一個非常大的性能獎勵。 – 2013-04-30 08:25:55

回答

7

它始終是更有效的與原語無論是在性能和​​內存方面的工作。但是BigInteger可以處理大於int和long的數字。例如

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

你可以給一個大於long的數字按位運算的用例嗎? – 2013-04-30 08:46:58

+1

簡單,請參閱更新 – 2013-04-30 08:55:06

+1

我認爲Noam要求提供一個用例,而不是如何實現它。處理IPv6地址的子網掩碼(128位)將是一個。 – jarnbjo 2013-04-30 09:38:22