2010-11-15 6 views
14

Je lis des opérateurs bit à bit aujourd'hui et ils me semblent plutôt pratiques. J'ai aussi remarqué qu'Apple les utilise aussi, par exemple avec UIViewAutoresizing.Quelques questions sur les opérateurs bit à bit

Dans mon application, je dois garder une trace des sept jours de la semaine. Chaque jour peut être activé ou désactivé. J'ai déjà eu sept BOOL « s, mais maintenant je suis en train d'utiliser un seul entier pour cela:

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; 

Ma question est, comment puis-je activer/désactiver ces valeurs maintenant? Je sais que je peux vérifier une variable days pour un jour comme celui-ci:

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

Mais comment puis-je ..

  1. jeudi activer?
  2. Désactiver jeudi?
  3. basculer jeudi?
  4. Autoriser tous?
  5. Désactiver tout?

Merci.

+0

Je vais juste laisser [ce] (http://graphics.stanford.edu/~seander/bithacks.html) ici. – outis

+1

Harkens revient aux jours où nous avons passé beaucoup de temps à voir combien nous pourrions serrer les données. Opérateurs bit à bit pour les situations on/off comme ça, en utilisant deux bits pour les choses avec 3 ou 4 états, etc. Je reste toujours penché de cette façon mais je suis beaucoup plus détendu maintenant que l'espace et la bande passante ont augmenté de façon spectaculaire. –

Répondre

26

Je ne suis pas très familier avec l'objectif-c, mais voici les bases quand il s'agit d'opérateurs au niveau du bit.

option Activer jeudi

days = days | DaysThursday; 

Désactiver jeudi

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

Bascule jeudi

days = days^DaysThursday; 

Activer tout

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

Désactiver tout

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

Merci. J'en ai ajouté quelques autres, pourriez-vous jeter un coup d'œil? – Rits

+1

Ajout du tout activer et désactiver toutes les réponses. –

+0

"Disable Thursday" ne serait-il pas mieux comme ça ?: days = days &! DaysThursday; – v01d

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