关于按位运算符的一些问题

Rit*_*its 14 iphone cocoa-touch bit-manipulation objective-c ios

我今天读到了关于按位运算符的内容,它们对我来说似乎很方便.我也注意到Apple也使用它们,例如UIViewAutoresizing.

在我的应用程序中,我需要跟踪一周中的七天.每天都可以启用或禁用.我曾经有七个BOOL,但现在我正在尝试使用一个整数:

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;
Run Code Online (Sandbox Code Playgroud)

我的问题是,我现在如何启用/禁用这些值?我知道我可以检查days特定日期的变量,如下所示:

if (days & DaysThursday) {
    // thursday enabled
}
Run Code Online (Sandbox Code Playgroud)

但我怎么..

  1. 星期四?
  2. 星期四禁用?
  3. 周四切换?
  4. 启用所有?
  5. 禁用所有?

谢谢.

Jon*_*der 26

我对objective-c不太熟悉,但这里是处理按位运算符时的基础知识.

启用星期四

days = days | DaysThursday;
Run Code Online (Sandbox Code Playgroud)

禁用星期四

allDays = DaysMonday | DaysTuesday | ... | DaysSunday;
days = days & (allDays ^ DaysThursday);
// OR
days = days & ~DaysThursday;
Run Code Online (Sandbox Code Playgroud)

周四切换

days = days ^ DaysThursday; 
Run Code Online (Sandbox Code Playgroud)

全部启用

allDays = DaysMonday | DaysTuesday | ... | DaysSunday;
days = days | allDays;
// OR
days = allDays;
Run Code Online (Sandbox Code Playgroud)

禁用所有

days = days ^ days;
// OR
days = 0;
Run Code Online (Sandbox Code Playgroud)

  • @ v01d你应该使用按位`not`操作符,`~`:`days = days &~DaysThursday;` (2认同)