2011-10-19 11 views
12

Có phương pháp nào thường được sử dụng để kiểm tra xem cờ có tồn tại trong loại dữ liệu int/khác không? Tôi đã tìm ra một cái gì đó như thế này:kiểm tra bit nếu cờ có mặt

if ((host&flagtocheckfor)==flagtocheckfor) 

Điều gì hoạt động tốt nhưng đây là cách cờ thường được kiểm tra? Hoặc là có một phương pháp ngắn gọn hơn?

+2

Bạn không cần == flagtocheckfor part. Kết quả của & là 0 (bit bị tắt) hoặc không 0 (bit được bật), và trong C ít nhất, đã tương ứng với Sai và True. – librik

+1

@ librik, không sao đối với mặt nạ đơn bit nhưng một số có thể là bội số. Xem câu trả lời của tôi. – paxdiablo

Trả lời

23

Đó là khá tốt chính xác cách cờ bit được kiểm tra bằng hầu hết các ngôn ngữ hỗ trợ chúng.

Ví dụ:

#define BIT_7 0x80 
#define BITS_0_AND_1 0x03 

if ((flag & BIT_7) == BIT_7) ... 
if ((flag & BITS_0_AND_1) == BITS_0_AND_1) ... 

Trong khi bạn có thể kiểm tra cái gì đó như là người đầu tiên với:

if ((flag & BIT_7) != 0) ... 

rằng sẽ không thực sự làm việc cho phần thứ hai vì nó sẽ trở thành sự thật nếu hoặc của các bit được đặt, không phải là cả hai.

Để hoàn chỉnh, C cho phép bạn thiết lập các mặt nạ bit với:

flag = flag | BIT_7; // or you can also use 'flag |= BIT_7' 

Bạn có thể xóa chúng với:

flag = flag & (~BIT_7); 

Và chuyển đổi chúng với:

flag = flag^BIT_7; 
+0

Aha- cảm ơn bạn, tôi đã không chắc chắn. – ultifinitus