2013-04-30 37 views
7

Có lợi thế nào khi sử dụng các hoạt động bitwise thuần túy (& |^~) khi sử dụng BigInteger (BigInteger.and BigInteger.or) cho các hoạt động bitwise về hiệu suất? ký ức? còn gì nữa không?Thao tác bitwise Java Vs BigInteger

Để tôi sử dụng BigInteger cho các thao tác bitwise vì mã kết quả dễ đọc hơn nhiều.

ví dụ cho mã mà tôi sẽ sử dụng:

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

bạn không phải chuyển đổi sang BigInteger? –

+0

không, các thao tác nằm giữa các số nhỏ (tối đa 2^10) cho mục đích che mặt –

+0

Ý tôi là, thực tế bạn không phải tạo đối tượng BigInteger mới hoặc hai có thể là một phần thưởng hiệu suất khá lớn. –

Trả lời

7

Nó luôn luôn là hiệu quả hơn để làm việc với nguyên thủy cả về hiệu suất và bộ nhớ. Nhưng BigInteger có thể làm việc với số lớn hơn int và dài. Ví dụ:

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

bạn có thể đưa ra trường hợp sử dụng các thao tác bitwise trên một số lớn hơn dài không? –

+1

dễ dàng, xem cập nhật –

+1

Tôi nghĩ Noam đã yêu cầu một trường hợp sử dụng chứ không phải cách thực hiện nó. Xử lý mặt nạ mạng con cho địa chỉ IPv6 (128 bit) sẽ là một. – jarnbjo