Объясните назначение операции "&" в этих функциях. - 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;
}