2010-04-25 9 views
5

Trong một số mã tôi đang làm việc trên tôi nên chăm sóc mười tham số độc lập có thể lấy một trong hai giá trị (0 hoặc 1). Điều này tạo ra 2^10 điều kiện riêng biệt. Một số các điều kiện không bao giờ xảy ra và có thể được bỏ ra, nhưng những điều xảy ra vẫn còn rất nhiều và làm cho một switch để xử lý tất cả các trường hợp là điên.Tính toán và phát hiện bit cờ

Tôi muốn sử dụng 10 if báo cáo thay vì số lớn switch. Đối với điều này tôi biết tôi nên sử dụng cờ bit, hoặc thay cờ byte như ngôn ngữ là javascript và nó dễ dàng hơn để làm việc với một chuỗi 10 byte với đại diện cho một nhị phân 10-bit.

Bây giờ, vấn đề của tôi là, tôi không biết cách thực hiện điều này. Tôi đã thấy điều này được sử dụng trong API s nơi các tùy chọn có thể chọn nhiều được hiển thị với các số 1, 2, 4, 8, ..., n^(n-1) tương đương với số thập phân là 1, 10, 100, 1000, v.v. trong nhị phân. Vì vậy, nếu chúng ta thực hiện cuộc gọi như bar = foo(7), thanh sẽ là một đối tượng với bất kỳ tùy chọn nào cho phép ba cờ ngoài cùng bên phải.

Tôi có thể chuyển đổi số thập phân thành nhị phân và trong mỗi kiểm tra câu hỏi if để xem liệu chữ số tương ứng có được đặt hay không. Nhưng tôi tự hỏi, là có một cách để xác định số n-th của một số thập phân là số không hoặc một ở dạng nhị phân, mà không cần thực sự thực hiện chuyển đổi?

Trả lời

6

Chỉ cần sử dụng bitwise-và. Trong C/C++, việc này sẽ là:

if (flags & 1) { 
    // Bit zero is set. 
} 
if (flags & 2) { 
    // Bit one is set. 
} 
if (flags & 4) { 
    // Bit two is set. 
} 
... 

Đối với lòng tốt sản xuất, sử dụng tên tượng trưng cho mặt nạ cờ thay vì những con số kỳ diệu, 1, 2, 4, 8 vv

Nếu cờ là đồng nhất một cách nào đó (ví dụ, họ đại diện cho mười khía cạnh không gian trong một số vấn đề hình học) và mã để xử lý từng trường hợp là như nhau, bạn có thể sử dụng một vòng lặp:

for (int f = 0; f < 10; ++f) { 
    if (flags & (1 << f)) { 
     // Bit f is set. 
    } 
} 
+0

WOW! Rất nhanh! Tôi muốn chấp nhận câu trả lời của bạn ngay lập tức, nhưng rõ ràng tôi nên đợi ít nhất 9 phút. Cảm ơn thực sự. –

+0

+1 đang nhập nội dung nào đó tương tự nhưng bạn đã nhanh hơn;) –

1

bạn có thể nhận được một số mà có bit n-bit và AND với số của bạn. Nếu kết quả bằng không, số của bạn không có bộ bit. Nếu không, nó đã làm. Hãy xem here.

2

Bạn có thể sử dụng một Bitwise và:

10 & 2^1 is true because 10 = 1010b 
           ^1 
8 & 2^1 is false because 8 = 1000b 
           ^0 
10 & 2^3 is true because 10 = 1010b 
          ^1