Замена данных в ячейках float [требует правки]

257
23 декабря 2016, 14:05

Имеется некоторое число float. Необходимо написать программу, которая заменяет в представлении этого числа последний байт на значение "0xAA" и, после изменения, выводит новое число(полученное в результате изменения). Буду благодарен за вашу помощь.

Answer 1

Непонятно, старший или младший байт... Потому написал для обоих.

int main()
{
    assert(sizeof(float) == sizeof(unsigned int));
    float f,save;
    scanf("%f",&f);
    save = f;
    unsigned int * p = (unsigned int *)&f;
    printf("%10f   %08X\n",f,*p);
    *p = (*p&0xFFFFFF00) | 0xAA;   // Младший байт
    printf("%10f   %08X\n",f,*p);
    f = save;
    *p = (*p&0x00FFFFFF) | (0xAA << 24);  // Старший байт
    printf("%10f   %08X\n",f,*p);
}
Answer 2

Можно использовать следующий подход

#include <iostream>
#include <iomanip>
#include <cstdint>
//...
float x = 123.456789;
std::cout << "x = " << std::setprecision(16) << x << std::endl;
std::cout << "x = " << std::hex << reinterpret_cast<uint32_t &>( x ) << std::endl;
reinterpret_cast<uint32_t &>(x) &= ~(uint32_t)0 << 8;
std::cout << "x = " << std::setprecision( 16 ) << x << std::endl;
std::cout << "x = " << std::hex << reinterpret_cast<uint32_t &>(x) << std::endl;
reinterpret_cast<uint32_t &>(x) |= (uint32_t)0xAA;
std::cout << "x = " << std::setprecision(16) << x << std::endl;
std::cout << "x = " << std::hex << reinterpret_cast<uint32_t &>(x) << std::endl;

Вывод данного фрагмента кода может выглядеть как

x = 123.456787109375
x = 42f6e9e0
x = 123.455078125
x = 42f6e900
x = 123.4563751220703
x = 42f6e9aa

Или то же самое можно сделать, используя указатель. Например

float x = 123.456789;
uint32_t *px = reinterpret_cast<uint32_t *>(&x);
std::cout << "x = " << std::setprecision(16) << x << std::endl;
std::cout << "x = " << std::hex << *px << std::endl;
*px &= ~(uint32_t)0 << 8;
std::cout << "x = " << std::setprecision( 16 ) << x << std::endl;
std::cout << "x = " << std::hex << *px << std::endl;
*px |= (uint32_t)0xAA;
std::cout << "x = " << std::setprecision(16) << x << std::endl;
std::cout << "x = " << std::hex << *px << std::endl;

Вывод на консоль этого фрагмента кода будет таким же, как показано выше.

READ ALSO
Удаление объектов. Вопрос по теории

Удаление объектов. Вопрос по теории

Изучаю вопрос о грамотном управлении памятьюКак я понял, вызывать метод delete() для каждого виджета необязательно, достаточно при его создании...

261
Динамический вывод из MySQL

Динамический вывод из MySQL

Есть база данных с таблицами статистики, 4 идентичных таблицы с разными названиями и иерархией - //категория - подкатегория - проект - таблица...

291
Оптимизация SQL запроса (Copying To Tmp Table)

Оптимизация SQL запроса (Copying To Tmp Table)

Как можно оптимизировать данный запрос ?

329