2016-12-28 6 views
0

여러 항목 목록이 있습니다. 목록 수 < 8. 목록의 항목 수 < 16. 사용자는 각 목록에서 하나의 항목을 선택할 수 있습니다. 그래서 우리는 일련의 정수를가집니다. 예 : 9, 0, 12, 4목표 C에서 비트 시프 팅을 통해 하나의 정수에 여러 개의 작은 정수를 저장하는 방법

하나의 정수 (32 또는 64)에 사용자 선택을 저장하고 거기에서 읽는 쉬운 방법이 있습니까?

4 비트 정수의 순서를 저장하는 가장 좋은 방법은 알고 계십니까?

감사합니다.

+0

안녕하세요. 제발, "최적"을 정의하십시오. 메모리 또는 성능을 의미합니까? 하나의 정수에 숫자를 저장하면 메모리가 더 효율적이지만 속도는 느려집니다. 각 숫자를 유형에 저장하면 크기는 컴퓨터에서 한 단어의 크기와 같지만 빠르지 만 효율성은 떨어집니다. – 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; 
}