Не понимаю кусок кода с побитовым ИЛИ - C (СИ)
Формулировка задачи:
Здравствуйте!
Есть код. Не понимаю что он будет возвращать назад. Написана куча выриантов через или. А что и как из этого выбереться для возврата?
Заранее спасибо!
unsigned int getNumber(unsigned char *p) { return (unsigned int) *(p + 0) << 24 | (unsigned int) *(p + 1) << 16 | (unsigned int) *(p + 2) << 8 | (unsigned int) *(p + 3) << 0; }
Решение задачи: «Не понимаю кусок кода с побитовым ИЛИ»
textual
Листинг программы
typedef struct { unsigned int type; unsigned int start; unsigned int size; char descr[DESCR_SIZE]; } PartEntry; PartEntry ptr[NPE]; void convertPartitionTable(PartEntry *e, int n) { // Параметры ptr, NPE=16 int i; unsigned char *p; for (i = 0; i < n; i++) { p = (unsigned char *) &e[i]; e[i].type = getNumber(p + 0); e[i].start = getNumber(p + 4); e[i].size = getNumber(p + 8); } }
Объяснение кода листинга программы
- Объявлен массив структур PartEntry с именем ptr и размером NPE элементов.
- В структуре PartEntry имеются следующие поля:
- type (тип) - целочисленное поле, в котором хранится информация о типе раздела.
- start (начало) - целочисленное поле, в котором хранится информация о начале раздела в секторе диска.
- size (размер) - целочисленное поле, в котором хранится информация о размере раздела в секторах диска.
- descr (описание) - символьное поле, в котором хранится описание раздела.
- Функция convertPartitionTable принимает на вход указатель на структуру PartEntry и целое число, которое представляет количество элементов в массиве.
- Внутри функции перебираются все элементы массива.
- Для каждого элемента выполняется следующее:
- Переменная p инициализируется значением указателя на текущий элемент массива, приведенным к типу unsigned char *.
- Значение поля type текущего элемента массива устанавливается равным значению, полученному с помощью функции getNumber, в которую передается смещение в байтах от начала указателя p и тип возвращаемого значения - unsigned int.
- Значение поля start текущего элемента массива устанавливается равным значению, полученному с помощью функции getNumber, в которую передается смещение в байтах от начала указателя p и тип возвращаемого значения - unsigned int.
- Значение поля size текущего элемента массива устанавливается равным значению, полученному с помощью функции getNumber, в которую передается смещение в байтах от начала указателя p и тип возвращаемого значения - unsigned int.
- Значение функции getNumber для каждого поля текущео элемента массива равно 0.
- В данном коде используется побитовый ИЛИ (|) для получения значения поля type из двух однобитных полей, значения которых равны 0.
- Размер массива NPE равен 16.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д