2015-10-11 2 views
0

Я должен упаковать некоторые шорты в 32-битное целое число. Это домашнее задание, которое приведет к большей идее сжатия/декомпрессии.Получение коротких замыканий от целого числа

У меня нет проблем с пониманием того, как упаковать шорты в целое число, но я изо всех сил пытаюсь понять, как получить каждое короткое значение, хранящееся в целых числах.

Так, например, я сохраняю значения 2, 4, 6, 8 в целое число. Это означает, что я хочу напечатать их в том же порядке, в котором я их вводил.

Как вы собираетесь получать эти значения из целого числа?

EDIT: Шорты в этом контексте означают двухзначное целое число без знака.

+0

Можете ли вы объяснить, что «короткий «В этом контексте? (Не могу не думать о клинах, которые вы собираетесь дать тем бедным ints) – sehe

+0

Короткий бытие двухбайтовое целое. Я добавлю это в описание. – ariyo

ответ

0

Как Craig поправил меня, короткая переменная 16 бит, Therfore только 2 шорты может поместиться в одном межд, так вот мой ответ получение шорты:

2|4 
000000000000001|00000000000000100 
00000000000000100000000000000100 
131076 

обозначающие первый как левая переменная и последняя как право наиболее переменные, получение коротких переменного хотел бы так:

int x = 131076; //00000000000000100000000000000100 in binary 
short last = x & 65535; // 65535= 1111111111111111 
short first= (x >> 16) & 65535; 

и вот мой предыдущий ответ фиксированный для сжатия символов (8 битных переменных): Давайте предположим, что первый символ является один старт на MSB, а последний - один на концах на МЗБ:

2|4|6|8 
00000001|00000010|000000110|00001000 
000000010000001000000011000001000 
33818120 

Таким образом, в этом примере первый символ равен 2 (0010), а затем 4 (0100), 6 (0110) и последнее: 8 (1000).

так, чтобы получить сжатые числа назад можно было бы использовать этот код:

int x = 33818120; //00000010000001000000011000001000 in binary 
char last = x & 255; // 255= 11111111 
char third = (x >> 8) & 255; 
char second = (x >> 16) & 255; 
char last = (x >> 24) & 255; 
+0

OP добавил комментарий, чтобы уточнить, что «короткий» - [std def of] 16 бит. Таким образом, маскировка против 255 и создание 4 чисел не работает - это предполагает char. Я вижу замешательство, основанное на 2,4,6,8 ОП, но это то, ради чего мы здесь. –

+0

Ты прав, мой плохой. –

+0

Спасибо вам за ваши ответы. Думаю, теперь я чувствую себя намного яснее.Я не думал четко, когда писал пост, поэтому я просто выбросил 2, 4, 6, 8 как просто случайные числа, которые нужно сохранить. В действительности, только два были бы сохранены: ^) – ariyo

0

Это было бы более интересно с гольца [как вы получите 4]. Но вы можете упаковать только два шорты в один int. Итак, я немного озадачен этим тем, что думал инструктор.

Рассмотрим объединение:

union combo { 
    int u_int; 
    short u_short[2]; 
    char u_char[4]; 
}; 

int 
getint1(short s1,short s2) 
{ 
    union combo combo; 

    combo.u_short[0] = s1; 
    combo.u_short[1] = s2; 

    return combo.u_int; 
} 

short 
getshort1(int val,int which) 
{ 
    union combo combo; 

    combo.u_int = val; 

    return combo.u_short[which]; 
} 

Теперь рассмотрим кодирование/декодирование со сдвигами:

unsigned int 
getint2(unsigned short s1,unsigned short s2) 
{ 
    unsigned int val; 

    val = s1; 
    val <<= 16; 
    val |= s2; 

    return val; 
} 

unsigned short 
getshort2(unsigned int val,int which) 
{ 

    val >>= (which * 16); 

    return val & 0xFFFF; 
} 

без знака кода выше, вероятно, сделать то, что вы хотите.

Но, следующие виды использования подписаны значения и, вероятно, не будет работать, а потому, что вы можете иметь смешанные признаки между s1/s2 и кодирования/декодирования, которые могут представлять проблемы

int 
getint3(short s1,short s2) 
{ 
    int val; 

    val = s1; 
    val <<= 16; 
    val |= s2; 

    return val; 
} 

short 
getshort3(int val,int which) 
{ 

    val >>= (which * 16); 

    return val & 0xFFFF; 
} 
Смежные вопросы