2016-12-28 4 views
0

Il existe plusieurs listes d'éléments. Le nombre de listes < 8. Le nombre d'éléments dans une liste < 16. L'utilisateur peut sélectionner un élément dans chaque liste. Nous avons donc une séquence d'entiers. Par exemple: 9, 0, 12, 4.Comment enregistrer plusieurs petits entiers dans un entier via le décalage de bits dans Objective C

Il existe un moyen simple de stocker la sélection de l'utilisateur dans un entier (32 ou 64) et de le lire à partir de là?

Peut-être connaissez-vous la manière la plus optimale de stocker une séquence d'entiers de 4 bits?

Merci!

+0

Bienvenue chez SO. S'il vous plaît, définissez "optimal". Voulez-vous dire la mémoire ou la performance? Stocker des nombres dans un nombre entier sera plus efficace en mémoire mais plus lent. Stocker chaque nombre dans un type, quelle taille est égale à la taille d'un mot sur la machine est plus rapide, mais moins efficace. – FreeNickname

+1

Vous pouvez utiliser les champs de bits de C dans les structures. –

+0

En outre, si les listes peuvent contenir un nombre variable d'éléments, vous devez également stocker un certain nombre d'éléments. Comme chaque élément prend 4 bits, et le nombre maximum d'éléments est 16, 16 * 4 = 64, donc il n'y a pas d'espace pour un certain nombre d'éléments à gauche. Vous devrez le stocker séparément. – FreeNickname

Répondre

0
+ (NSArray *)arrayFromLongint:(uint32_t)longint { 
    uint8_t shortint; 
    NSMutableArray *array = [[NSMutableArray alloc] init]; 
    for (uint8_t i = 0; i < 32; i = i + 4) { 
     shortint = longint >> i & 15; // 15 is 00001111 in binary 
     [array addObject:[NSNumber numberWithUnsignedShort:shortint]]; 
    } 
    return array; 
} 

+ (uint32_t)longintFromArray:(NSArray *)array { 
    uint8_t shortint, itemIndex = 0; 
    uint32_t longint = 0; 
    NSNumber *item; 
    for (uint8_t i = 0; i < 32; i = i + 4) { 
     if ([[array objectAtIndex:itemIndex] isKindOfClass:[NSNumber class]]) { 
      item = [array objectAtIndex:itemIndex]; 
      shortint = [item unsignedShortValue] & 15; // 15 is 00001111 in binary 
      longint = longint | shortint << i; 
     } 
     itemIndex++; 
    } 
    return longint; 
}