Объясните назначение операции "&" в этих функциях. - C (СИ)

Узнай цену своей работы

Формулировка задачи:

В книжке по сетевому программированию автор приводит две функции как пример упаковки чисел с плавающей точкой для отправки в сеть. Вот эти функции:
Листинг программы
  1. #include <stdint.h>
  2. uint32_t htonf(float f)
  3. {
  4. uint32_t p;
  5. uint32_t sign;
  6. if (f < 0) { sign = 1; f = -f; }
  7. else { sign = 0; }
  8. p = ((((uint32_t)f)&0x7fff)<<16) | (sign<<31); // whole part and sign
  9. p |= (uint32_t)(((f - (int)f) * 65536.0f))&0xffff; // fraction
  10. return p;
  11. }
  12. float ntohf(uint32_t p)
  13. {
  14. float f = ((p>>16)&0x7fff); // whole part
  15. f += (p&0xffff) / 65536.0f; // fraction
  16. if (((p>>31)&0x1) == 0x1) { f = -f; } // sign bit set
  17. return f;
  18. }
Для чего используется операция & над битами,ведь как я понял,число никак при этом не меняется? И ещё вопрос: Почему автор ничего не упомянул о порядке байтов перед отправкой в сеть и не сделал ничего в данных функциях для их изменения (т.е. он просто упустил или есть причина)?

Не по теме:

Для справки,это из Beej Network Programming Guide,стр.40

Решение задачи: «Объясните назначение операции "&" в этих функциях.»

textual
Листинг программы
  1. union u
  2. {
  3.   uint32_t whole;
  4.   struct
  5.   {
  6.     unsigned sign:1;
  7.     unsigned int_part:15;
  8.     unsigned fraction:16;
  9.   } parts;
  10. };
  11.  
  12. uint32_t htonf(float f)
  13. {
  14.   union u uu;
  15.  
  16.   uu.parts.sign = (f < 0) ? 1 : 0;
  17.   /* Здесь запишутся 15 старших бит целой части. Т.е. для чисел, больших чем 32768,
  18.    * значение попросту потеряется */
  19.   uu.parts.int_part = (int)f;
  20.   /* Записываем дробную часть: выделяем дробную часть, умножаем на 65536, чтобы
  21.    * результат оказался в диапазоне от 0 до 65535 (влезет в 16 бит). Понятное дело,
  22.    * что точность при этом потеряется */
  23.   uu.parts.frac = (f - (int)f) * 65536.0f;
  24.  
  25.   return uu.whole;
  26. }

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


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

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

8   голосов , оценка 4.25 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы