Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943

Пример из книги Герберт Шилдт

16.04.2017, 22:50. Показов 2559. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пример: Пример использования объединения для побайтного вывода значения типа double в двоичном представлении
У меня вопрос не к объединениям а к самому примеру. Что за побайтный вывод он там использует? В чём смысл задания?
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);
    void show_bits();
    double d;
    unsigned char c[sizeof (double)];
};
 
bits::bits(double a)
{
    d = a;
}
 
void bits::show_bits()
{
    for(int j=sizeof (double) - 1; j>=0; j--)
    {
        cout << "Двоичное представление байта: " << j << ":";
        for(int i=128; i; i>>=1)
            if(i & c[j]) cout << "1";
            else cout << "0";
        cout << endl;
    }
}
 
int main()
{
    setlocale(LC_ALL, "rus");
    bits ob(1995);
 
    ob.show_bits();
 
}
И почему в 22 строчке цикл начинается с 128 и где условия остановки цикла после объявления i?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.04.2017, 22:50
Ответы с готовыми решениями:

Какие книги стоит купить после "Герберт Шилдт С++ для начинающих"?
Почти дочитал данную книгу, многое узнал. Планирую изучать язык и дальше. Какую книгу желательно приобрести для дальнейшего обучения? ПС....

Пример из книги. Шилдт
Всем привет. Вот пример из книги Шилдта. У меня не работает деструктор (не выводится сообщение) #include &lt;iostream&gt; using...

пример из книги Шилдт С++ базовый курс - непонятно
На стр 72 приведен пример // эта программа демонстрирует использование ф-и xor() #include &lt;iostream&gt; using namespace std; ...

12
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
17.04.2017, 00:03
Похоже так как-то
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void bits::show_bits()
{
    for(int j=sizeof (double) - 1; j>=0; j--)
    {
        cout << "Двоичное представление байта: " << j << ":";
//я заменил сдвиг явным делением
        for(int i=128; i; i/=2)//идём по степеням 2-ки вниз это в двоичном представлении такие числа
            // 10000000, 1000000, 100000, 1000, 100, 10, 1, 0 <-(тут циклу конец)
            if(i & c[j]) cout << "1";//тут проверяется установка бита соответствующего ведущей единице
            else cout << "0";//если не установлен то 0
        cout << endl;
    }
}
0
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
17.04.2017, 17:31  [ТС]
А причём тут это?
C++
1
unsigned char c[sizeof (double)];
Чем он там массив типа char заполняет? А потом ещё и сравнивает.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
17.04.2017, 17:49
Цитата Сообщение от no swear Посмотреть сообщение
Чем он там массив типа char заполняет?
Свежим даблом. Причём сказать что "заполняет", - преувеличение. Union это возможность хранить по одному адресу два разных типа. Размер определяется тем что длиннее. Шилд, - мужик не промах. Есть характер и нервы. Ему на стрикт алиазинг рул - всё равно. Хотя по последним веяниям, читать из union можно лишь то, что писалось последним.
Фактически это похоже на реинтерпрет того дабла, которым был инициирован конструктор.

Добавлено через 11 минут
Это менее безопасно, но может так понятнее будет:
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
#include <bitset> 
using namespace std;
 
union bits
{
    bits(double);
    void show_bits();
    double d;
    unsigned char c[sizeof (double)];
};
 
bits::bits(double a)
{
    d = a;
}
 
void bits::show_bits()
{
    for(int j=sizeof (double) - 1; j>=0; j--)
    {
        cout << "Двоичное представление байта: " << j << ":";
        for(int i=128; i; i/=2)//идём по степеням 2-ки вниз это в двоичном представлении такие числа
            // 10000000, 1000000, 100000, 1000, 100, 10, 1, 0 <-(тут циклу конец)
            if(i & c[j]) cout << "1";//тут проверяется установка бита соответствующего ведущей единице
            else cout << "0";//если не установлен то 0
        cout << endl;
    }
}
 
void show_bits(unsigned char* c)
{
    for(int j=sizeof (double) - 1; j>=0; j--)
    {
        cout << "Двоичное представление байта: " << j << ":";
        for(int i=128; i; i/=2)//идём по степеням 2-ки вниз это в двоичном представлении такие числа
            // 10000000, 1000000, 100000, 1000, 100, 10, 1, 0 <-(тут циклу конец)
            if(i & c[j]) cout << "1";//тут проверяется установка бита соответствующего ведущей единице
            else cout << "0";//если не установлен то 0
        cout << endl;
    }
}
 
int main()
{
    setlocale(LC_ALL, "rus");
    double db=1995;
    bits ob(db); 
    ob.show_bits();
    cout<<endl;
 
//вот те же байты, - вид в профиль
    unsigned char * c = (unsigned char * )&db;
    show_bits(c);
 
    cout<<endl; 
    cin.get(); 
}
почитайте про union
0
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
17.04.2017, 18:22  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
почитайте про union
Читаю, просто ещё не до конца разбираюсь в битовых полях. Можете дать ссылку какую-нибудь чтобы почитать о битовых операциях, а то в инете не доконца всё объясняется.
Всё же не ясно почему for начинается с 128 и какую роль играет здесь unsigned char c[sizeof (double)];.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
17.04.2017, 19:07
Цитата Сообщение от no swear Посмотреть сообщение
битовых полях
bit_set и объединение это разные звери. Его потом тоже посмотрите.
Цитата Сообщение от no swear Посмотреть сообщение
просто ещё не до конца разбираюсь в битовых полях.
До конца не надо. Я тоже не до конца разбираюсь. Но не было случая, чтобы код работающий с этими полями не смог разобрать. Погуглите побитовые операции. Там логика вполне последовательна. Пока Вам не нужно общаться с портом какой-то микросхемы, это вряд ли актуально. Главное понять принцип, чтобы когда припечёт, взять, да и сваять чё нить адекватное.

Добавлено через 13 минут
Цитата Сообщение от no swear Посмотреть сообщение
Всё же не ясно почему for начинается с 128 и какую роль играет здесь unsigned char c[sizeof (double)];.
и что я должен ещё написать к вот этому:
//идём по степеням 2-ки вниз это в двоичном представлении такие числа
// 10000000, 1000000, 100000, 1000, 100, 10, 1, 0 <-(тут циклу конец)

?
128 в терминах понятных беззнаковому целому длиной 8 бит (unsigned char) это команда- "старшую единицу установить!" То есть когда вы пишете туда то, что считаете десятичным 128, оно воспринимает, наоборот, как 10000000
Потом операция самосдвиг>>= просто укорачивает число на один ноль. То есть в каждой итерации цикла вы проверяете и печатаете следующий бит слева-на-право от крайне левого. Это хорошая идея, потому как cout'у так удобнее. Хотя можно бы начать с единицы и смещать влево, а перевернуть в рекурсивной функции или ещё как-то, но Шилдт не любит загромождать примеры ненужными деталями. За что его и любят те кто не любит ненужных деталей.
0
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
18.04.2017, 14:02  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
for(int i=128; i; i/=2)
а почему не 256? Ведь 128 это 27?
Цитата Сообщение от IGPIGP Посмотреть сообщение
if(i & c[j]) cout << "1";
Это условие не до конца ясно
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
18.04.2017, 18:44
Цитата Сообщение от no swear Посмотреть сообщение
а почему не 256? Ведь 128 это 27
Двойка в бинарном представлении это десятка. В 27седьмой степени это единица и семь нулей, то есть 8 бит.
Цитата Сообщение от no swear Посмотреть сообщение
Это условие не до конца ясно
https://msdn.microsoft.com/ru-... ec0b2.aspx
у i только одна ведущая единица. Остальное нули. Значит в результате будет или i или 0. То есть истина для i=128 соответствует установленному седьмому биту в c[j].
no swear, вы пробовали распечатать резульат i & c[j] и вообще поэкспериментировать с & для пары чисел, где одно, - степень двойки, а другое, - нет. Как-то уж очень сложно это получается. Может бросить битовые операции пока?
0
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
18.04.2017, 21:26  [ТС]
Я знаю что делает оператор и, или, исключающее или. Ну вот смотрите общая картина такая, у нас есть переменная типа double которая имеет 8 байт, 1 байт = 8 бит т. е. в каждом байте у него по восемь ячеек где хранятся 0 и 1. У нас есть какое-то число и оно сохранилось в этих байтах в виде 0 и 1 и задача такова что нам надо вывести биты каждого байта так? А чтобы это сделать мы использовали этот метод
C++
1
2
3
4
5
6
7
8
for(int j=sizeof (double) - 1; j>=0; j--)
    {
        cout << "Двоичное представление байта: " << j << ":";
        for(int i=128; i; i>>=1)
            if(i & c[j]) cout << "1";
            else cout << "0";
        cout << endl;
    }
Я правильно понимаю? Если да то нельзя ли просто вывести значения каждого бита по вызову адреса ячейки?
0
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562
18.04.2017, 21:31
Только что ответил в соседней теме
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
#include <iostream>
#include <Windows.h>
#include <cstdlib>
#include <string>
 
std::string dec_to_bin(unsigned long long num)
{
    std::string bin;
 
    while (num != 0)
    {
        bin = char((num & 0x01) + '0') + bin;
 
        num >>= 1;
    }
 
    return bin;
}
 
int main()
{
    unsigned long num (28111988);
    std::cout << dec_to_bin(num) << std::endl;
 
    system ("pause");
    return 0;
}
0
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
18.04.2017, 21:35  [ТС]
Цитата Сообщение от Photofenix Посмотреть сообщение
(num & 0x01)
Можете объяснить что это?
0
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562
18.04.2017, 21:48
Я порекомендую прочитать Лафоре, гораздо лучше Шилдта.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
18.04.2017, 22:45
Цитата Сообщение от no swear Посмотреть сообщение
Я правильно понимаю? Если да то нельзя ли просто вывести значения каждого бита по вызову адреса ячейки?
Можно. Но придётся же в двоичную систему переводить всё равно. Вид символа или приведенного к целому char'а, это грустное зрелище в данном контексте. Но можно применить библиотечные функции перевода числа в строковое представление и использующие radix основание. Таковые есть и из с-совместимых и в родных плюсовых. Шилдт показал довольно изящный метод. Ковбой, это же почти гусар. Только ковбой...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.04.2017, 22:45
Помогаю со студенческими работами здесь

C++ и Герберт Шилдт
Здравствуйте. Вот сижу я, выбираю себе книгу для изучения плюсов и вижу, что почему-то все дико хейтят Шилдта и его &quot;С++ Базовый...

Герберт Шилдт, С++ Шаг за шагом
Приветствую всех! Я чайник в С++, и заказал себе книгу Герберт Шилдт, С++ Шаг за шагом. Стоило того? Будет ли понятна эта книга, если я...

пример из книги
#include &lt;iostream.h&gt; long summa (int k,...){ int *pik=&amp;k; char *pc=(char *)pik; cout &lt;&lt;&quot; *pc=&quot;&lt;&lt;*pc&lt;&lt;&quot;...

пример из книги страуструпа
struct pair { char* name; // ñòðîêà int val; // öåëîå }; const int large = 1024; ...

Не работает пример из книги
Я писал код из книжки и ничего не работает. #include &lt;iostream&gt; using namespace std; #include &lt;conio.h&gt; int main(){ ...


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

Или воспользуйтесь поиском по форуму:
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