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