Объясните назначение операции "&" в этих функциях. - 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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д