2010-11-15 62 views
14

Tôi đã đọc về các toán tử bitwise ngày nay và chúng dường như khá tiện dụng đối với tôi. Tôi cũng nhận thấy Apple cũng sử dụng chúng, ví dụ: UIViewAutoresizing.Một số câu hỏi về các toán tử bitwise

Trong ứng dụng của tôi, tôi cần theo dõi bảy ngày trong tuần. Mỗi ngày có thể được bật hoặc tắt. Tôi từng có bảy BOOL 's, nhưng bây giờ tôi đang cố gắng sử dụng một số nguyên duy nhất cho việc này:

enum { 
    DaysMonday = 1 << 0, 
    DaysTuesday = 1 << 1, 
    DaysWednesday = 1 << 2, 
    DaysThursday = 1 << 3, 
    DaysFriday = 1 << 4, 
    DaysSaturday = 1 << 5, 
    DaysSunday = 1 << 6 
}; 
typedef NSUInteger Days; 

Câu hỏi của tôi là, làm thế nào tôi có thể kích hoạt/vô hiệu hóa những giá trị bây giờ? Tôi biết tôi có thể kiểm tra một biến days cho một ngày cụ thể như thế này:

if (days & DaysThursday) { 
    // thursday enabled 
} 

Nhưng làm thế nào để tôi ..

  1. phép thứ năm?
  2. vô hiệu hóa thứ năm?
  3. chuyển đổi thứ năm?
  4. bật tất cả?
  5. vô hiệu hóa tất cả?

Cảm ơn bạn.

+0

tôi sẽ chỉ để lại [này] (http://graphics.stanford.edu/~seander/bithacks.html) ở đây. – outis

+1

Harkens trở lại những ngày khi chúng tôi dành nhiều thời gian để xem chúng tôi có thể thu thập dữ liệu bao nhiêu. Các toán tử bitwise cho các tình huống on/off như thế này, sử dụng hai bit cho những thứ có 3 hoặc 4 trạng thái, v.v. Tôi vẫn nạc theo cách đó đôi khi nhưng tôi cảm thấy thoải mái hơn khi không gian và băng thông tăng lên đáng kể. –

Trả lời

26

Tôi không quá quen thuộc với mục tiêu-c, nhưng đây là những điều cơ bản khi giao dịch với các toán tử bitwise.

Enable Thứ năm

days = days | DaysThursday; 

Disable Thứ năm

allDays = DaysMonday | DaysTuesday | ... | DaysSunday; 
days = days & (allDays^DaysThursday); 
// OR 
days = days & ~DaysThursday; 

Chuyển đổi thứ năm

days = days^DaysThursday; 

Enable All

allDays = DaysMonday | DaysTuesday | ... | DaysSunday; 
days = days | allDays; 
// OR 
days = allDays; 

Disable All

days = days^days; 
// OR 
days = 0; 
+0

Cảm ơn. Tôi đã thêm một vài thứ nữa, bạn có thể xem qua không? – Rits

+1

Đã thêm tất cả & tắt tất cả câu trả lời. –

+0

Sẽ không 'Vô hiệu hóa Thứ Năm' sẽ tốt hơn như thế này ?: days = days &! DaysThursday; – v01d

3
days = DaysMonday | DaysWednesday | DaysFriday | DaysSaturday; 
days = days | DaysThursday; 
days = days & ~DaysSaturday;