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

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

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

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

Не по теме:

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

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

textual
Листинг программы
union u
{
  uint32_t whole;
  struct
  {
    unsigned sign:1;
    unsigned int_part:15;
    unsigned fraction:16;
  } parts;
};
 
uint32_t htonf(float f)
{
  union u uu;
 
  uu.parts.sign = (f < 0) ? 1 : 0;
  /* Здесь запишутся 15 старших бит целой части. Т.е. для чисел, больших чем 32768,
   * значение попросту потеряется */
  uu.parts.int_part = (int)f;
  /* Записываем дробную часть: выделяем дробную часть, умножаем на 65536, чтобы
   * результат оказался в диапазоне от 0 до 65535 (влезет в 16 бит). Понятное дело,
   * что точность при этом потеряется */
  uu.parts.frac = (f - (int)f) * 65536.0f;
 
  return uu.whole;
}

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


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

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

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