"Упаковать" четыре символа в беззнаковое целое. Длина беззнакового целого равна 4. Привет, изучаю С++ и наткнулся на такую задачку, но не понимаю сути вопроса. Почитал про побитовые операторы, разобрался как они работают, но что значит "упаковать"?Длина целого равная 4 - это unsigned int под который выделяется 4 байта? Нужно объявить и присвоить 4 символа (по байту каждый) в целочисленную переменную (размером 4)или что?
что значит упаковать? Придумать пару процедур, не обязательно оформленную в виде функций, первая из которых берёт 4 символа и создаёт значение переменной типа uint_32, из которого с помощью второй процедуры можно получить исходные символы в исходной последовательности. Сделать это можно несколькими способами.
Задачи распаковать-то не поставлено ;)
Так что нужно написать одну функцию, которая принимает unsigned char[4] (или unsigned char*) и возвращает uint_32.
alloooooo, Например, нашёл такой код по запросу в браузере
char a, b, c, d;
unsigned int pack;
pack = (((((a << 8) | b) << 8 ) | c) << 8) | d;
Зачем производят сдвиг влево на 8 бит и к чему тут побитовое или. Вроде когда читал про них, понял что из-за сдвига меняется битовое число, но зачем тут оно производится? Если говорю что-то неверно, то прошу поправить.
lz961, а можете объяснить зачем используется сдвиг на 8 + оператор или, хочу понять к чему это используют? Чтобы затем распокавав все символы имели исходную последовательность?
lz961, если честно, нет( Зачем умножать на размер таблицы(имеется ввиду ведь таблица символов?). Почему в конце, где функция возвращает номер символа d, но не умножается на размер?
alloooooo, аналогия с записью числа в позиционной системе счисления. Например: в 10 системе 4621=4*1000 + 6*100+ 2*10 +1 = ((4*10 + 6)*10 + 2)*10 + 1. Посмотрим теперь на нашу строку, как на число, закодированное в системе счисления, основание которой равно размеру кодовой таблице. Рассчитать число можно по той же формуле, которую я привёл выше.
В С используется ASCII кодировка, реализованная так, что в номер символа и содержимое ячейки памяти, в которой он хранится тождественны, т.е. ord(c) == c, и смысла в отдельной функции "ord" нет, размер таблицы символов равен числу значений, которые может принимать однобайтовая переменная ct_size=256=2**8. Если вы читали про сдвиги, то должно быть понятно, что a*256 == a<<8. Остаётся побитовое ИЛИ "|". Оно работает так, пусть у вас есть два двоичных числа и вы их складываете в столбик. Побитовое или будет соответствовать сложению, но без переноса разряда. Сами можете убедиться, что такого сложения достаточно в данном случае.