2010-11-15 20 views
14

He leído acerca de los operadores bit a bit hoy y me parecen bastante útiles. También noté que Apple los usa también, por ejemplo, con UIViewAutoresizing.Algunas preguntas sobre los operadores bit a bit

En mi aplicación necesito hacer un seguimiento de los siete días de la semana. Todos los días se pueden habilitar o deshabilitar. Solía ​​tener siete BOOL 's, pero ahora estoy tratando de usar un solo número entero de esto:

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; 

Mi pregunta es, ¿cómo puedo activar/desactivar aquellos valores que ahora? Sé que puedo comprobar una variable days para un día específico de esta manera:

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

Pero ¿cómo puedo ..

  1. activo el Jueves?
  2. desactivar Jueves?
  3. toggle jueves?
  4. habilitar todo?
  5. ¿desactivarlo todo?

Gracias.

+0

Voy a dejar [esto] (http://graphics.stanford.edu/~seander/bithacks.html) aquí. – outis

+1

Recuerda los días en que pasamos mucho tiempo viendo cuánto podíamos exprimir datos. Operadores bit a bit para situaciones de encendido/apagado como este, usando dos bits para cosas con 3 o 4 estados, etc. Todavía me inclino de esa manera a veces pero estoy mucho más relajado sobre eso ahora que el espacio y el ancho de banda han aumentado tan dramáticamente. –

Respuesta

26

No estoy muy familiarizado con objetivo-c, pero estos son los conceptos básicos cuando se trata de operadores bit a bit.

Habilitar Jueves

days = days | DaysThursday; 

Desactivar Jueves

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

Toggle Jueves

days = days^DaysThursday; 

Activar todas

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

Deshabilitar todo

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

Gracias. Agregué algunos más, ¿podrías echar un vistazo? – Rits

+1

Agregó habilitar todas y deshabilitar todas las respuestas. –

+0

¿No 'Deshabilitar Jueves' sería mejor así ?: days = days &! DaysThursday; – v01d

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