2009-04-23 41 views
6

Tôi cần thực hiện phép tính nghịch đảo, bao gồm bitwise AND operation, làm cách nào để thực hiện?Nghịch đảo của bitwise AND trong C# là gì?

Tôi đã dùng thử OR độc quyền, nhưng không hiệu quả.

 int i = 254 & 2; 
     Console.Write("254 & 2 ={0}", i + "\n"); 
     Console.Write("{0}^2 ={1}",i, (i^2) + "\n"); 

Không hoạt động. Làm cách nào để tính toán?

+3

Khi bạn nói "Không hoạt động", ý của bạn là gì? Nó biên dịch và tạo ra kết quả mong đợi cho tôi. Kết quả hiển thị cho bạn là gì và quan trọng hơn là bạn muốn nó hiển thị kết quả nào cho bạn? –

+0

Hoạt động bitwise đảo chiều duy nhất mà bạn có là XOR, vì vậy '(a^b)^b == a'. Nếu bạn muốn đảo ngược hoạt động của mình và bạn chưa chết khi sử dụng AND, hãy thử thay vào đó. – Blindy

Trả lời

27

Cho i, bạn không thể lấy lại 254. Bởi & ing nó bạn đã phá hủy những gì dữ liệu đã không được lưu trữ trong bit thứ hai.

1111 1110 
&0000 0010 
---------- 
0000 0010 

Bạn sẽ khôi phục 6 bit bị mất như thế nào? Đối với x & 2 == 2, bạn có thể đặt hầu hết mọi số x và điều đó là đúng.

0010 1010 // = 42 
&0000 0010 
---------- 
0000 0010 

x 254 hoặc 42? Bạn không thể nói.

3

Bạn không thể, bạn đã mất dữ liệu đã có khi bạn thực hiện &.

4-bit ví dụ:

1110 & 0010 = 0010 

Bạn không có cách nào để biết đó là bit 1 và đó là không nếu bạn chỉ biết kết quả 0010 và các toán hạng thứ hai của & (còn 0010).

21

Về mặt kỹ thuật đối lập với AND là NAND:

~ (254 & 2)

Lưu ý rằng ~ là các nhà điều hành bổ sung, và thực hiện một Bitwise NOT (chuyển từng chút để nó đối diện).

Chính xác bạn muốn gì? Bạn đang cố gắng để thực hiện?

Nếu bạn đang cố gắng hoàn tác phép tính, bạn không thể - không có hàm nghịch đảo nào mà inverseand (và (x, y)) sẽ trả về x hoặc y, ngay cả khi nghịch đảo được cho một trong số chúng.

-Adam

+2

+1 một phần vì tôi nghĩ * bạn đang đi đúng hướng, nhưng chủ yếu là vì câu hỏi "bạn muốn gì", thực sự là vấn đề ở đây ... nó không hoàn toàn rõ ràng những gì anh ấy đang cố gắng làm. – Beska

0

Ý bạn là gì khi tính toán ngược lại?

Nếu bạn thấy số 254 là một thanh ghi bit bao gồm 8 bit thì tất cả các bit nhưng số cuối cùng được đặt thành 1.

Tính toán 254 & 2 giống như kiểm tra xem bit số 2 trong thanh ghi đã được đặt hay chưa.

Điều gì trái ngược với điều này? Kiểm tra xem tất cả các bit khác có được đặt không?

0

Nếu mục đích của hoạt động & là kiểm tra xem bit 1 đã được đặt chưa, thì hoạt động "đối diện" tiềm năng là 'đặt bit 1'.

tức là .:

val = val | 2; 

này ghi đè giá trị hiện tại chút 2, và không chạm vào bất kỳ bit khác.

Nếu 8 bit trong byte được coi là các bit hoàn toàn độc lập thì có thể thay đổi bất kỳ thứ gì trong số chúng bằng cách chạm vào bất kỳ phần nào khác.

Trong trường hợp này, không quan trọng là một số thông tin ban đầu đã bị mất. Chúng tôi không thực sự quan tâm đến giá trị của các bit khác và thường xuyên nhất khi sử dụng bit mask, giá trị ban đầu của bit được đề cập là 0.

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