Побитовые операции с float - C (СИ)
Формулировка задачи:
Установить в заданное пользователем состояние определённое количество рядом стоящих бит, номер старшего бита, как и всё остальное, вводится с клавиатуры.
Вот моя программа , она написана для int. Она рабочая, но требуется сделать еще так, чтобы она работала для формата float. Я понимаю, что это можно сделать несколькими способами: с помощью указателя, с помощью union,с помощью файла, но как это применить ума не приложу. Весь интернет облазила подобных примеров не нашла. Помогите пожалуйста.
Решение задачи: «Побитовые операции с float»
textual
Листинг программы
#include <stdio.h>
void bit_print(unsigned int *pif)
{
int i=0;
int y=sizeof(*pif)*8-1;
for (i=y; i>=0; --i) {
printf ("%x", (*pif)>>i & 1);
if (i!=y && i%4==0) printf(" ");
}
printf ("\n");
};
int main ()
{
float x=2.3;
unsigned int ix1=0x40133333;
unsigned int ix2=0xc0133333;
unsigned int * pif;
pif=(void*)&x;
bit_print(pif);
pif=&ix1;
bit_print(pif);
x=-x;
pif=(void*)&x;
bit_print(pif);
pif=&ix2;
bit_print(pif);
return 0;
}
Объяснение кода листинга программы
В этом коде выполняются побитовые операции с целыми числами, которые представляют float.
- Создается функция
bit_print, которая принимает указатель на unsigned int в качестве аргумента. - Внутри функции создаются две переменные:
iиy.iинициализируется значениемy, которое равно размеру типа unsigned int, умноженному на 8 и уменьшенному на 1.yинициализируется значениемsizeof(*pif)*8-1, гдеsizeof(*pif)возвращает размер типа, который указываетpif, и умножается на 8 для получения максимального бита.
- Затем следует цикл
for, который начинается сyи итерируется вниз до 0.- Внутри цикла происходит следующее:
- Используется оператор побитовой сдвига
>>для сдвига битов числа, на которое указываетpif, вправо наiпозиций. - Используется оператор побитовой И
&для получения бита в позицииi. - Используется оператор
printfдля вывода бита в десятичном формате. - Если
iне равноyиiделится на 4 без остатка, то выводится пробел.
- Используется оператор побитовой сдвига
- Внутри цикла происходит следующее:
- В конце функции выводится символ новой строки
\n. - В функции
mainсоздаются следующие переменные:xинициализируется значением 2.3.ix1иix2инициализируются значениями 0x40133333 и 0xc0133333 соответственно.pifинициализируется значениемNULL, а затем приводится к типуvoid*и переприсваивается значению адреса переменнойx.
- Функция
bit_printвызывается с аргументомpif. - Значение
pifизменяется на адресix1. - Функция
bit_printвызывается с аргументомpif. - Значение
xизменяется на противоположное. - Значение
pifизменяется на адресx. - Функция
bit_printвызывается с аргументомpif. - Значение
pifизменяется на адресix2. - Функция
bit_printвызывается с аргументомpif. - Программа возвращает 0, завершая работу.