2009-12-12 30 views
5

). Giả sử bạn có hai số nguyên, a = 8, b = 2. Trong C++ a | b là sự thật. Tôi đã sử dụng hành vi đó để làm việc với các bộ sưu tập cờ. Ví dụ: các cờ sẽ là 1, 2, 4, 8, v.v. và bất kỳ bộ sưu tập nào của chúng sẽ là duy nhất. Tôi không thể tìm thấy làm thế nào để làm điều đó trong C#, như | và các toán tử & không hoạt động giống như trong C++. Tôi đọc tài liệu về các toán tử trong C# nhưng tôi vẫn không hiểu.Bitwise Hoặc: C# so với C++

CHỈNH SỬA:

Thật không may, tôi dường như làm mọi thứ lộn xộn ở đâu đó. Lấy mã này ví dụ:

byte flagCollection = 8; 
byte flag = 3; 

if ((flag | flagCollection) != 0) MessageBox.Show("y"); else MessageBox.Show("n"); 

Trả về "y" cho bất kỳ giá trị nào tôi đặt trong cờ. Điều này là hiển nhiên, bởi vì 3 | 8 sẽ là 11. Hmmmm ... những gì tôi muốn làm là có một bộ sưu tập cờ: 1, 2, 4, 8, 16 và khi tôi đưa ra một số, để có thể xác định cờ là gì.

Trả lời

14

Các &| nhà khai thác trong C# cũng giống như trong C/C++. Ví dụ: 2 | 8 là 10 và 2 & 8 là 0.

Sự khác biệt là một int không được tự động xử lý như giá trị logic. intbool là các loại riêng biệt trong C#. Bạn cần phải so sánh số int với một số int khác để nhận được bool.

if (2 & 8) ...   // doesn't work 

if ((2 & 8) != 0) ... // works 
+0

Any1 có ví dụ về cách sử dụng này không? –

+0

'int' không được chuyển đổi' thành 'bool' trong C++, bởi vì, vì không có kiểu' bool' - 'int' được sử dụng như 'bool'. – Noldorin

+6

@Noldorin: Không phải như vậy - C (trước C99) không có kiểu bool, và tại một thời điểm (trước khi chuẩn hóa) C++ cũng không, nhưng C đã có bool (về mặt kỹ thuật nó được đặt tên _Bool) cho khoảng một thập kỷ, và C++ đã có nó lâu hơn. –

8

Nó không phải là bitwise và/hoặc các toán tử khác nhau trong C#. Chúng hoạt động gần giống như trong C++. Sự khác biệt là trong C# không có chuyển đổi ngầm từ số nguyên sang boolean.

Để khắc phục vấn đề của bạn, bạn chỉ cần để so sánh với số không:

if ((a | b) != 0) { 
    ... 
5

Không giống như C/C++, C# duy trì sự tách biệt khá chặt chẽ giữa phép tính số học và phép toán.

Các nhà thiết kế của C# coi việc chuyển đổi tự động các kiểu tích phân thành boolean là nguồn lỗi mà họ muốn C# không có, vì vậy bạn phải rõ ràng kết quả số học của bạn thành kết quả boolean bằng cách giới thiệu so sánh:

if ((a | b) != 0) { 
    // ... 
} 

Tôi nghĩ rằng cũng không phải là một ý tưởng tồi trong C/C++, nhưng tôi thừa nhận rằng tôi không thực sự tuân theo lời khuyên đó (và tôi sẽ không tranh luận nó rất khó).