Не понимаю кусок кода с побитовым ИЛИ - 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);
  }
}

Объяснение кода листинга программы

  1. Объявлен массив структур PartEntry с именем ptr и размером NPE элементов.
  2. В структуре PartEntry имеются следующие поля:
    • type (тип) - целочисленное поле, в котором хранится информация о типе раздела.
    • start (начало) - целочисленное поле, в котором хранится информация о начале раздела в секторе диска.
    • size (размер) - целочисленное поле, в котором хранится информация о размере раздела в секторах диска.
    • descr (описание) - символьное поле, в котором хранится описание раздела.
  3. Функция convertPartitionTable принимает на вход указатель на структуру PartEntry и целое число, которое представляет количество элементов в массиве.
  4. Внутри функции перебираются все элементы массива.
  5. Для каждого элемента выполняется следующее:
    • Переменная p инициализируется значением указателя на текущий элемент массива, приведенным к типу unsigned char *.
    • Значение поля type текущего элемента массива устанавливается равным значению, полученному с помощью функции getNumber, в которую передается смещение в байтах от начала указателя p и тип возвращаемого значения - unsigned int.
    • Значение поля start текущего элемента массива устанавливается равным значению, полученному с помощью функции getNumber, в которую передается смещение в байтах от начала указателя p и тип возвращаемого значения - unsigned int.
    • Значение поля size текущего элемента массива устанавливается равным значению, полученному с помощью функции getNumber, в которую передается смещение в байтах от начала указателя p и тип возвращаемого значения - unsigned int.
  6. Значение функции getNumber для каждого поля текущео элемента массива равно 0.
  7. В данном коде используется побитовый ИЛИ (|) для получения значения поля type из двух однобитных полей, значения которых равны 0.
  8. Размер массива NPE равен 16.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.667 из 5
Похожие ответы