Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 09.10.2019
Сообщений: 2
1

Ошибка в битовых сдвигах/битовых масках

09.10.2019, 22:44. Показов 849. Ответов 3
Метки си (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Написал программу, ориентирующуюся на принцип записи числа по IEEE 754. Требуется вывести сигну, экспоненту и мантису - но почему-то с выводом проблемы. В правильности битовых сдвигов и битовых масок уверен ибо делал всё с предельной ориентировкой на стандарт IEEE 754, однако где-то видимо допустил ошибку по-невнимательности. Просьба высказывать абсолютно все предположения, ибо с этой темой сижу почти неделю - вроде код кажется правильным, постоянно в голове прогоняю а на выходе всё равно что-то да не то. Вводимое число - float.
P.S. Цель этой темы именно разобраться в битовых сдвигах и масках, ибо ,видимо, я не до конца понимаю принцип их работы, либо понимаю но неправильно
https://chortle.ccsu.edu/Assem... EEE754.jpg
Сам код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
int main()
{
    union 
    {
        unsigned i;
        float f;
    } u;
 
    scanf_s("%f", &u.f);
    int signa = u.i & 0x80000000;
    signa =  signa >> 31;
    int exponent = u.i & 0x7F800000;
    exponent = exponent >> 23;
    int mantissa = u.i & 0x007FFFFF;
    printf("IEEE 754: -1 in expent %d * 2 in expent %d * %d ", signa,exponent,mantissa);
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.10.2019, 22:44
Ответы с готовыми решениями:

Применение битовых операций
Когда нужно применять битовые операции? Как они работают разобрался, но когда применять - нет В...

Особенности битовых сдвигов
Совершаю два битовых сдвига: а) int x = 5 &gt;&gt; 100; б) int x = 5; printf (&quot;%d&quot;, (unsigned) x &gt;&gt;...

Задача на освоение битовых операций
Задача: подается число типа int, необходимо вывести его двоичное представление на экран и...

Упаковка и распаковка 5-битовых кодов
Привет всем! Есть задача: Большие латинские буквы упаковываются в виде 5-битных кодов по 3 символа...

3
817 / 504 / 211
Регистрация: 19.01.2019
Сообщений: 1,196
10.10.2019, 02:35 2
C
1
2
3
int sign = (u.i >> 31) & 1;
int exponent = (u.i >> 23) & 0xFF;
int mantissa = u.i & 0x7FFFFF;
1
0 / 0 / 0
Регистрация: 09.10.2019
Сообщений: 2
10.10.2019, 15:44  [ТС] 3
Цитата Сообщение от nalbe666 Посмотреть сообщение
int sign = (u.i >> 31) & 1;
int exponent = (u.i >> 23) & 0xFF;
int mantissa = u.i & 0x7FFFFF;
Почему так и в чём смысл битовой маски если пропущены нули - обнуления, соответственно, нет?
P.S. Или же это работает с так называемыми незначимыми нулями?

Добавлено через 14 минут
Цитата Сообщение от nalbe666 Посмотреть сообщение
0xFF
Почему же именно такая маска?
0
817 / 504 / 211
Регистрация: 19.01.2019
Сообщений: 1,196
10.10.2019, 22:26 4
int sign = u.i >> 31;
// Сдвинули до последнего бита, стало 0x1 или 0x0.
// Конъюнкция лишняя, результат и так 0x1 или 0x0.

int exponent = (u.i >> 23) & 0xFF;
// Сдвигаем до экспоненты. Она занимает 8 бит. Маска для первых 8 бит - 0xff (000...11111111).
// Если не сдвигать, и наложить маску 0x7f800000, то вначале будет 23 ненужных 0.

int mantissa = u.i & 0x7FFFFF;
// Тут сразу копируем первые 23 бита.
0
10.10.2019, 22:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.10.2019, 22:26
Помогаю со студенческими работами здесь

Использование битовых полей структуры
Многие не рекомендуют использовать битовые поля структуры. Нашел этому пока одно объяснение. &quot;На...

Составить программу для вычисления арифметических, логических и битовых выражений
Вот собственно задание: Составить программу для вычисления арифметических, логических и битовых...

Реализовать длинную арифметику с использованием битовых операций и больших чисел
Всем привет. Возникла задача реализовать длинную арифметику с использованием битовых операций и...

С помощью только битовых операций превратите последний 0 в 1, а все остальное превратить в 0
С помощью только битовых операций(еще и без циклов, проверок, инкремента и смени знака) превратите...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru