Khác với các phép nhân và bitshifting, bạn cũng có thể sử dụng một enum để ghi lại mối quan hệ. Thông thường không đáng để nỗ lực, nhưng chỉ để hoàn thành ...
enum Encoding
{
Flag3 = 1, NotFlag3 = 0,
Flag2 = 1 << 1, NotFlag2 = 0,
Flag1 = 1 << 2, NotFlag1 = 0
};
int val = (boolVal1 ? Flag1 : NotFlag1) |
(boolVal2 ? Flag2 : NotFlag2) |
(boolVal3 ? Flag3 : NotFlag3);
Tại sao bạn lại bận tâm với điều này? Nó chỉ tổng quát hơn một chút, vì vậy bạn có thể thay đổi giá trị mã hóa sau này mà không phải chạm vào mã có khả năng phân phối bằng các giá trị thực (ví dụ, nếu bạn nhận ra mình đã bỏ ra một chút so với định dạng của một số tệp hoặc mạng dữ liệu bạn cần để phân tích cú pháp, bạn có thể thêm nó vào chỉ một nơi và biên dịch lại). Tất nhiên, tốt hơn hết là chỉ cung cấp một chức năng mã hóa/giải mã đơn lẻ và nếu bạn đang thêm các cờ mới, bạn vẫn cần đến nó.
Trong khi có Flag1 và NotFlag1 có vẻ vô nghĩa, thường là trường hợp bạn có thứ gì đó giống như các giá trị loại trừ lẫn nhau, hoặc Nam và Nữ, và không có lý do cụ thể nào để buộc khách hàng kiểm tra câu trả lời ! Chú ý hoặc Nữ như Nam vv ..
Nguồn
2012-07-03 12:45:17
Chỉ cần fyi, không nên "đúng true" kết quả trong một 7? Nếu không, tất cả các công thức cho đến nay là sai ... – SinisterMJ
'int val = 4 * boolVal1 + 2 * boolVal2 + boolVal3;' sẽ cho 7 khi bạn có đúng sự thật đúng không 8 –
Đúng, tôi vừa đăng nó sai. Thx để sửa! – tzippy