OR bit a bit de constantes

Ao ler alguma documentaçãoaqui, Me deparei com isso:

unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;

Não tenho ideia de como isso funciona. Eu li sobre os operadores bit a bit em C, mas não entendo como você pode ajustar três (ou mais!) Constantes dentro de um int e, posteriormente, ser capaz de extraí-los de volta do int? Indo além da documentação, também encontrei isso, provavelmente relacionado:

typedef enum {
   kCFCalendarUnitEra = (1 << 1),
   kCFCalendarUnitYear = (1 << 2),
   kCFCalendarUnitMonth = (1 << 3),
   kCFCalendarUnitDay = (1 << 4),
   kCFCalendarUnitHour = (1 << 5),
   kCFCalendarUnitMinute = (1 << 6),
   kCFCalendarUnitSecond = (1 << 7),
   kCFCalendarUnitWeek = (1 << 8),
   kCFCalendarUnitWeekday = (1 << 9),
   kCFCalendarUnitWeekdayOrdinal = (1 << 10),
} CFCalendarUnit;

Como os(1 << 3) declarações / variáveis funcionam? Desculpe se isso é trivial, mas alguém poderia me esclarecer explicando ou talvez postando um link para uma boa explicação?

questionAnswers(5)

yourAnswerToTheQuestion