2012-02-07 17 views
13

Tôi đang tìm cách vận hành dựa trên mặt nạ bit và các thao tác boolean bit (XOR/NOR/OR/AND/NOT/EQV/etc). Nói chung, tôi thực sự là giống như cách tiếp cận kiểu phương pháp mở rộng, nhưng trong trường hợp này, tôi thấy nó hơi lộn xộn một chút.BitArray và XOR

Có cách nào khác để làm việc với bit trong C# không?

 BitArray a = new BitArray(0x001); 
     BitArray b = new BitArray(0x100); 
     BitArray c = new BitArray(0x010); 

     BitArray test = a | b; // won't compile 
     BitArray test2 = a^c; // won't compile 

     BitArray test3 = a.Or(b); // compiles 
     BitArray test4 = a.Xor(c); // compiles 
+3

Tại sao không chỉ hoạt động trên int? int a = 0x001; int b = 0x100; int test = a | b; hoạt động tốt. –

+9

Tôi không nghĩ rằng [hàm tạo có 'int'] (http://msdn.microsoft.com/en-us/library/4ty2t3fx.aspx) làm những gì bạn nghĩ. – svick

+0

@RobertRouhani Điều đó làm việc cho ví dụ cụ thể này, nhưng những gì về một số bit tùy ý? bạn phải có một cấu trúc riêng biệt cho một số nguyên 96 bit, ví dụ. – annonymously

Trả lời

20

Không có cách nào để thực hiện trực tiếp với BitArray - nhưng bạn luôn có thể tạo lớp bao bọc chứa BitArray và xác định toán tử của riêng bạn tại đó.

Tất nhiên, nếu bạn đang làm việc với 64 bit hoặc ít hơn, bạn chỉ có thể sử dụng một long hoặc ulong và được thực hiện với nó ...

+0

Hoặc nếu xuống đến 32 bit, chỉ cần sử dụng 'BitVector32' :) – leppie

+0

@leppie Nếu đó là 32 bit, cách dễ nhất sẽ là sử dụng tiêu chuẩn' int' hoặc 'uint' – annonymously

+0

@ nặc danh: Không nếu bạn không biết bitops. Đối với người mới bắt đầu, BitVector32 sẽ dễ dàng hơn, đặc biệt là khi giao dịch với mặt nạ, v.v. – leppie

6

Thật không may, vì không có cách nào để dịch các phương thức đó thành toán tử. Tôi hy vọng (như tôi chắc chắn nhiều người khác làm tốt) rằng điều này sẽ được thay đổi trong tương lai, nhưng bây giờ không có cách nào để làm điều đó.

12

Không có cách nào để làm điều này với BitArray và cho một lý do chính đáng: các hoạt động như Or hoặc Xorsửa đổi toán hạng đầu tiên. Đó không phải là những gì | hoặc ^ thường làm.

Nếu bạn muốn, bạn có thể tạo trình bao bọc có toán tử bạn muốn, bao gồm sao chép giá trị của toán hạng đầu tiên trước khi thực hiện thao tác.

Các vấn đề liên quan