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

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

16.04.2017, 22:50. Показов 2510. Ответов 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
9005 / 4706 / 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
9005 / 4706 / 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
9005 / 4706 / 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
9005 / 4706 / 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
9005 / 4706 / 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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period . Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru