Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.97
Del_Piero_10
Smart is the new Sexy
25 / 25 / 1
Регистрация: 29.12.2008
Сообщений: 109
#1

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

03.01.2009, 14:40. Просмотров 4186. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2009, 14:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Побайтовый вывод значения типа double (C++):

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

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

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

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

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

Аргумент типа double несовместим с параметром типа double - C++
#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...

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

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

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

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

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

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

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

Я правильно понял принцип работы?
0
Vourhey
Почетный модератор
6482 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
03.01.2009, 16:09 #8
Да, принцип работы понял верно.
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
04.01.2009, 06:56 #9
Есть решение задачи побайтового вывода значения типа double на экран.
на самом деле это решение задачи побитового вывода значения типа double на экран, т.е. в итоге получится 8*8 битов выведется (если размер double 8 байт) или больше если другой double
0
Del_Piero_10
Smart is the new Sexy
25 / 25 / 1
Регистрация: 29.12.2008
Сообщений: 109
04.01.2009, 14:39  [ТС] #10
accept, извини, но америку не открыл =)
0
Vourhey
Почетный модератор
6482 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
04.01.2009, 14:42 #11
accept, да, мы в курсе, как ни странно. Тему закрываю.
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
06.01.2009, 00:15 #12
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
это выглядит как
Код
 0000000010101001
&
 0000000010000000
потом

Код
 0000000010101001
&
 0000000001000000
потом

Код
 0000000010101001
&
 0000000000100000
и тд

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

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

поэтому когда еденица в маске не съедается нулём, там остаётся не еденица а какая-то из степеней двойки, 128 64 32 и тд, но все они считаются истиной, т.к. истиной считается всё даже отрицательные и дробные числа кроме лжи, а ложь только ноль;
выводится еденица на экран, а при лжи выводится ноль на экран
2
proplayer
6 / 6 / 0
Регистрация: 05.01.2009
Сообщений: 85
06.01.2009, 12:33 #13
Однако & это еще побитовое И (00101100 & 10010110 = 00000100)
| это побитовое ИЛИ (00101100 | 10010110 = 10111110)
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.01.2009, 12:33
Привет! Вот еще темы с ответами:

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

Вывод значения типа enum C++ - C++
Как сделать вывод значения типа enum через printf() ? #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdio.h&gt; using namespace...

функция принимает два параметра типа double и возвращает значение типа double - C++
Напишите функцию, которая принимает два параметра типа double и возвращает значение типа double, содержащее их минимум....

Запись информации из вектора типа string в вектор типа double - C++
Как записать только числа , которые хранятся в векторе типа стринг, в вектор типа дабл, в векторе типа стринг есть как буквы так и числа ,...


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

Или воспользуйтесь поиском по форуму:
13
Yandex
Объявления
06.01.2009, 12:33
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru