2016-12-28 5 views
0

いくつかの項目のリストがあります。リストの番号< 8.任意のリスト内の項目の数< 16.ユーザーは各リスト内の1つの項目を選択できます。そのため、一連の整数があります。例:9,0,12,4.0Objective Cでビットシフティングを使用して1つの整数に複数の小さな整数を保存する方法

ユーザー選択を1つのInteger(32または64)に保存し、そこから読み取る簡単な方法はありますか?

4ビット整数のシーケンスを格納する最適な方法を知っていますか?

ありがとうございます!

+0

ようこそ。 "最適"を定義してください。あなたは記憶やパフォーマンスを意味しますか? 1つの整数に数値を格納する方がメモリー効率は向上しますが、速度は遅くなります。マシン上の1ワードのサイズに等しいタイプの各数値を格納する方が高速ですが効率は低くなります。 – FreeNickname

+1

Cのビットフィールドを構造体に使用できます。 –

+0

また、リストにアイテムの数が可変であれば、多数のアイテムも保存する必要があります。各アイテムは4ビットをとり、アイテムの最大数は16であるので、16 * 4 = 64なので、多くのアイテムが残るスペースはありません。あなたはそれを別々に保管する必要があります。 – FreeNickname

答えて

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; 
} 
関連する問題