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

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

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

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

03.01.2009, 14:40. Просмотров 4051. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2009, 14:40     Побайтовый вывод значения типа double
Посмотрите здесь:

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

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

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

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

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

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

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

Я правильно понял принцип работы?
Vourhey
Почетный модератор
6473 / 2248 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
03.01.2009, 16:09     Побайтовый вывод значения типа double #8
Да, принцип работы понял верно.
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
04.01.2009, 06:56     Побайтовый вывод значения типа double #9
Есть решение задачи побайтового вывода значения типа double на экран.
на самом деле это решение задачи побитового вывода значения типа double на экран, т.е. в итоге получится 8*8 битов выведется (если размер double 8 байт) или больше если другой double
Del_Piero_10
Smart is the new Sexy
24 / 24 / 1
Регистрация: 29.12.2008
Сообщений: 109
04.01.2009, 14:39  [ТС]     Побайтовый вывод значения типа double #10
accept, извини, но америку не открыл =)
Vourhey
Почетный модератор
6473 / 2248 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
04.01.2009, 14:42     Побайтовый вывод значения типа double #11
accept, да, мы в курсе, как ни странно. Тему закрываю.
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
06.01.2009, 00:15     Побайтовый вывод значения типа double #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 и тд, но все они считаются истиной, т.к. истиной считается всё даже отрицательные и дробные числа кроме лжи, а ложь только ноль;
выводится еденица на экран, а при лжи выводится ноль на экран
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.01.2009, 12:33     Побайтовый вывод значения типа double
Еще ссылки по теме:

C++ Аргумент типа double несовместим с параметром типа double
C++ Вывод числа типа double как есть
C++ Вывод значения типа int с помощью MessageBox
Сделать вывод типа float в шаблоне вместо double C++
Аргумент типа double несовместим с параметром типа double* C++

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

Или воспользуйтесь поиском по форуму:
proplayer
6 / 6 / 0
Регистрация: 05.01.2009
Сообщений: 85
06.01.2009, 12:33     Побайтовый вывод значения типа double #13
Однако & это еще побитовое И (00101100 & 10010110 = 00000100)
| это побитовое ИЛИ (00101100 | 10010110 = 10111110)
Yandex
Объявления
06.01.2009, 12:33     Побайтовый вывод значения типа double
Ответ Создать тему
Опции темы

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