Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/49: Рейтинг темы: голосов - 49, средняя оценка - 4.73
Smart is the new Sexy
32 / 32 / 1
Регистрация: 29.12.2008
Сообщений: 109

Побайтовый вывод значения типа double

03.01.2009, 14:40. Показов 10839. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть решение задачи побайтового вывода значения типа double на экран. Объясните плиз каким образом это происходит. В частности функция: show_bits() и что записывается в массив С.

Вот собственно код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
using namespace std;
 
union bits {
    bits(double n);
    void show_bits();
    double d;
    unsigned char c[sizeof (double)];
};
 
bits::bits(double n)
{
    d=n;
}
 
void bits::show_bits()
{
    int i,j;
 
    for ( j=sizeof (double) - 1; j>=0; j--) {
        cout << "Двоичное представление байта " << j << ":";
        for ( i=128; i; i>>=1)
            if (i & c[j]) cout << "1";
            else cout << "0";
            cout << "\n";
    }
}
 
int main()
{
    system("chcp 1251");
    bits ob(19.829);
    cout << ob.c;
    ob.show_bits();
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.01.2009, 14:40
Ответы с готовыми решениями:

Ошибка вывода значения 0 типа double
При выполнении этого кода при значении x=0 не выводится четкий ноль. Почему? Я так понимаю нужно проводить округление? С printf такого нет....

Программа округляет вывод типа double
Приветствую форумчане! Решил написать программу которая высчитывает сумму ежемесячного платежа по формуле: Фромула: ...

печать значения типа double в обычной- десятичной форме.
Нужно вывести на экран значение переменной типа double . При этом нужно, что бы при любых значениях этой переменной на экран выводилось...

12
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
03.01.2009, 14:50
В коде выше я не вижу, что в С вообще что-то пишется. Там будет просто мусор.
А чтобы узнать, что происходит в show_bits тебе надо почитай про битовые операции в данном случае применяется "и".
0
Smart is the new Sexy
32 / 32 / 1
Регистрация: 29.12.2008
Сообщений: 109
03.01.2009, 15:07  [ТС]
Операцию "и" я положим знаю, но принцип вот этого вывода мне не понятен. Ведь там даже есть строка i & c[j]. Что оно дает я так и не понял. Может все-таки кто либо объяснит?

Добавлено через 10 минут 39 секунд
Ведь у нас в С действителньо ничего не кидается.... Что же нам дает i & c[j].
При чем если меняешь посылаемое значение в объект, т.е. d, то результаты изменяются....
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
03.01.2009, 15:19
У тебя union. Значит данные располагаются в памяти по одному адресу я думал ты догадаешься.
Дает тебе определить 1 там, или 0.
0
Smart is the new Sexy
32 / 32 / 1
Регистрация: 29.12.2008
Сообщений: 109
03.01.2009, 15:24  [ТС]
Чета я совсем туплю.... Блин... Все равно не могу понять как оно это осуществляет. Ведь в массиве С будет мусор... Такс...

Мы посылаем в d число... У нас есть массив, который по тмоу же адресу, значит число d будет в этом же массиве что ли?...
НЕ догоняю, почитал про битовые операции, понял как они действуют, но этого алгоритма так и не понял.... =(
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
03.01.2009, 15:32
значит число d будет в этом же массиве что ли?
Угу. Байты те же. Читай про union. Это плохое знание языка сказывается.
Ну, если не понял, то боюсь, что это тяжко
Посмотри на число 128 в двоичной системе. одна единица "справа". А потом мы ее смещаем:
i>>=1)
А потом проверяем битовой операцией, че у нас хорошего. Потом снова смещаем, чтобы проверить следующий бит...

P. S. толку не будет, если все разжевать. Столбиком напиши свои числа в двоичной системе и сам считай. Тогда ты поймешь как работает код.
1
Smart is the new Sexy
32 / 32 / 1
Регистрация: 29.12.2008
Сообщений: 109
03.01.2009, 16:01  [ТС]
Такс... Чтоб закрепить.

Получается что при передаче числа в d, оно автоматом получаеться и в массиве, так как при использовании объединения у нас адрес тот же самый. Число double у нас занимает 8 байт. Соответственно в массиве и будет записано 8 байт.
i у нас в двоичной системе при первом выполнении цикла равно 10000000. и мы используем битовуб операцию И... значит:

c[j] - там будет первый байт числа double.
i = 10000000

Каждый бит из 8-ми проведет операцию, но так как единица у нас слева стоит, то мы проверим только этот бит на наличие единицы. Затем цикл прогоняется 8 раз, какждый раз сдвигая единицу вправо. так мы получаем один байт... и там прогоням и выводим каждый байт.

Я правильно понял принцип работы?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
03.01.2009, 16:09
Да, принцип работы понял верно.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
04.01.2009, 06:56
Есть решение задачи побайтового вывода значения типа double на экран.
на самом деле это решение задачи побитового вывода значения типа double на экран, т.е. в итоге получится 8*8 битов выведется (если размер double 8 байт) или больше если другой double
0
Smart is the new Sexy
32 / 32 / 1
Регистрация: 29.12.2008
Сообщений: 109
04.01.2009, 14:39  [ТС]
accept, извини, но америку не открыл =)
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
04.01.2009, 14:42
accept, да, мы в курсе, как ни странно. Тему закрываю.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
06.01.2009, 00:15
C++
1
2
3
4
5
6
7
for ( j=sizeof (double) - 1; j>=0; j--) {
        cout << "Двоичное представление байта " << j << ":";
        for ( i=128; i; i>>=1)
            if (i & c[j]) cout << "1";
            else cout << "0";
            cout << "\n";
    }
128 - это 10000000 (8 бит в байте)
вообще при смещении это не 10000000, а 0000000010000000
операция & - побитовое умножение (что будет если ноль умножить на еденицу ?)
операция | - побитовое сложение (что будет если к нулю прибавить еденицу ?)
в логических операциях 1*1, 1+1 = 1 (а не два)

таким образом, если у тебя старший байт (это левый байт младшие правые) например представляет из себя 10101001
это выглядит как
Code
1
2
3
 0000000010101001
&
 0000000010000000
потом

Code
1
2
3
 0000000010101001
&
 0000000001000000
потом

Code
1
2
3
 0000000010101001
&
 0000000000100000
и тд

каждый раз они умножаются и все нули из маски (маска это число 128 сначала) съедают все нули и еденицы из проверяемого байта, а еденица из маски не съедает ни нуль ни еденицу, но её съедает ноль из проверяемого байта если он там есть

Code
1
2
                    if (i & c[j]) cout << "1";
            else cout << "0";
что такое истина в сишнике и в цпп ?
это всё что угодно кроме лжи
а что такое ложь там же ?
это только ноль (и все его виды NULL nullptr и прочие)

поэтому когда еденица в маске не съедается нулём, там остаётся не еденица а какая-то из степеней двойки, 128 64 32 и тд, но все они считаются истиной, т.к. истиной считается всё даже отрицательные и дробные числа кроме лжи, а ложь только ноль;
выводится еденица на экран, а при лжи выводится ноль на экран
2
 Аватар для proplayer
6 / 6 / 1
Регистрация: 05.01.2009
Сообщений: 82
06.01.2009, 12:33
Однако & это еще побитовое И (00101100 & 10010110 = 00000100)
| это побитовое ИЛИ (00101100 | 10010110 = 10111110)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.01.2009, 12:33
Помогаю со студенческими работами здесь

Вывод числа типа double как есть
Кто-нибудь помогите понять тип double!!! Как вывести заданное число как оно есть? Например, записываем в f число 14049.30493 то нужно...

Сделать вывод типа float в шаблоне вместо double
Здравствуйте,уважаемые пользователи.Недавно начал знакомится с шаблонами, и заметил одну вещь которая не дает мне покоя.Суть вот в чем,...

Вывод числа после запятой переменной типа double
Здравствуйте!!! У меня есть 2 программы, одну мне дали вторую написал. Та программа которая была написана мной работает чуть чуть...

Аргумент типа double несовместим с параметром типа double*
Функция function должна возвращать количество элементов массива, значение которые превышает значение средне арифметического элементов...

Аргумент типа double несовместим с параметром типа double
#include &lt;iostream&gt; #include &lt;cmath&gt; #include &lt;math.h&gt; using namespace std; #define c 40 #define n 5 double po(double...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru