Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Some questions about bitwise operators

I read about bitwise operators today and they seem rather handy to me. I also noticed Apple uses them too, for example with UIViewAutoresizing.

In my app I need to keep track of the seven days of the week. Each day can be either enabled or disabled. I used to have seven BOOL's, but now I'm trying to use a single integer for this:

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;

My question is, how can I enable/disable those values now? I know I can check a variable days for a specific day like this:

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

But how do I..

  1. enable thursday?
  2. disable thursday?
  3. toggle thursday?
  4. enable all?
  5. disable all?

Thank you.

like image 732
Rits Avatar asked Nov 15 '10 21:11

Rits


People also ask

Why bitwise operators are fast?

Yes, Bitwise operations are alot faster than any arithmetic operations because these operations are performed directly on the bits that is 0 and 1. In this operation we will get the output Odd.

What are bitwise operators good for?

Bitwise Operators are used for manipulating data at the bit level, also called bit level programming. Bitwise operates on one or more bit patterns or binary numerals at the level of their individual bits. They are used in numerical computations to make the calculation process faster.

How many types of bitwise operators are there?

AND, OR, XOR, NOT, SHIFT, and MASK are the 6 bitwise operators. Each bit in the number is regarded as a 0 or 1 by the operators, which work with the binary representation of numbers.

What happens when you perform a bitwise operator?

Bitwise Operators in C/C++ The & (bitwise AND) in C or C++ takes two numbers as operands and does AND on every bit of two numbers. The result of AND is 1 only if both bits are 1. The | (bitwise OR) in C or C++ takes two numbers as operands and does OR on every bit of two numbers.


2 Answers

I'm not too familiar with objective-c, but here are the basics when dealing with bitwise operators.

Enable Thursday

days = days | DaysThursday;

Disable Thursday

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

Toggle Thursday

days = days ^ DaysThursday; 

Enable All

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

Disable All

days = days ^ days;
// OR
days = 0;
like image 74
Jon Snyder Avatar answered Sep 30 '22 19:09

Jon Snyder


days = DaysMonday | DaysWednesday | DaysFriday | DaysSaturday;
days = days | DaysThursday;
days = days & ~DaysSaturday;
like image 30
filipe Avatar answered Sep 30 '22 20:09

filipe