0 / 0 / 0
Регистрация: 08.06.2018
Сообщений: 79
1

Упаковка битовых групп

20.11.2019, 17:11. Показов 3131. Ответов 15
Метки нет (Все метки)

Написать программу, которая упаковывает группы битов, содержащиеся в изолированных переменных, в одно 32-битовое целое беззнаковое число value.

Программа считает некорректно((
Пожалуйста, скажите что не так...

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
#include <iostream>
#include <iomanip>
using namespace std;
unsigned char reg, mod2;
unsigned short kop, reg2;
unsigned long value, value_a;
int main()
{
    for (;;)
    {   cin >> hex;
        cout << "Input KOP:";
        cin >> kop; getchar();
        cout << "Input REG:";
        cin >> reg; getchar();
        cout << "Input MOD2:";
        cin >> mod2; getchar();
        cout << "Input REG2:";
        cin >> reg2; getchar();
        
        reg2 &= 0x1ff; // clear all bits in the number, except for the low 9 (8 - 0)
        mod2 &= 0x1f; // clear all bits in the number, except for the low 5 (13 - 9)
        reg &= 0x3f; // clear all bits in the number, except for the low 6 (19-14)
        kop &= 0xfff; // clear all bits in the number, except for the low 12 ( (31-20)
 
        value = (value) | kop; // combine kop field with value
        value = (value << 12) | reg; // combine reg field with value
        value = (value << 6) | mod2; // combine mod2 field with value
        value = (value << 5) | reg2; // combine reg2 field with value
 
        // Formatted output
        cout << hex
            << "\nValue   (C++): " << value<< endl;
    };
    return 0;
}
Миниатюры
Упаковка битовых групп   Упаковка битовых групп  
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.11.2019, 17:11
Ответы с готовыми решениями:

Упаковка битовых групп
Доброго времени суток. Подскажите пожалуйста где я ошибся? Задание в шапке проги // File...

Упаковка и распаковка групп чисел и вероятность выпадения граней костей
21. Создать программу с функциями упаковки/распаковки группы из 6 чисел диапазона 0..31...

Выяснить, верно ли, что в данном тексте больше групп букв, чем групп знаков
Дан текст, каждый символ которого может быть малой буквой, цифрой или одним из знаков +,-,*....

Дана строка, состоящая из групп нулей и единиц.Найти количество групп с пятью символами
Дана строка, состоящая из групп нулей и единиц. Каждая группа отделяется от другой одним или...

15
Мозгоправ
1737 / 1031 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
20.11.2019, 18:01 2
Лучший ответ Сообщение было отмечено IllyaVik как решение

Решение

IllyaVik, во-первых, переменные типа char у вас вводятся как символы. Т.е. например f попадает в переменную как 0x66 (ASCII-код символа f), а не 0x0f. Во-вторых, не очищаете переменную value перед использованием. В-третьих, напутали со сдвигами. И, наконец, я бы подстраховался на счёт длины переменной value - стандарт не гарантирует, что unsigned long это точно 32 бита.

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
#include <iostream>
#include <iomanip>
#include <cstdint>
 
using namespace std;
 
unsigned char reg, mod2;
unsigned short kop, reg2;
uint32_t value, num;     // 32-битовое целое беззнаковое число
 
int main()
{
    for (;;)
    {
        cin >> hex;
        cout << "Input KOP:";
        cin >> kop; cin.ignore();
        cout << "Input REG:";
        cin >> num; cin.ignore();
        reg = (char)num;
        cout << "Input MOD2:";
        cin >> num; cin.ignore();
        mod2 = (char)num;
        cout << "Input REG2:";
        cin >> reg2; cin.ignore();
 
        reg2 &= 0x1ff; // clear all bits in the number, except for the low 9 (8 - 0)
        mod2 &= 0x1f; // clear all bits in the number, except for the low 5 (13 - 9)
        reg &= 0x3f; // clear all bits in the number, except for the low 6 (19-14)
        kop &= 0xfff; // clear all bits in the number, except for the low 12 ( (31-20)
 
        value = 0;
        value = value | kop << 20; // combine kop field with value
        value = value | reg << 14; // combine reg field with value
        value = value | mod2 << 9; // combine mod2 field with value
        value = value | reg2;      // combine reg2 field with value
 
        // Formatted output
        cout << hex
            << "\nValue   (C++): " << value << endl;
    };
    return 0;
}
1
фрилансер
4175 / 3584 / 801
Регистрация: 11.10.2019
Сообщений: 9,648
20.11.2019, 18:16 3
Лучший ответ Сообщение было отмечено IllyaVik как решение

Решение

а чтобы не плясать со сдвигами:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
...
...
        union s_value
        {
            uint32_t entire=0;
        
            struct
            {
                uint32_t reg2:9;
                uint32_t mod2:5;
                uint32_t reg:6;
                uint32_t kop:12;
            };
        } value;
        
        value.reg2= reg2;
        value.mod2= mod2;
        value.reg = reg;
        value.kop = kop;
 
        cout << hex << "\nValue   (C++): " << value.entire<< endl;
...
...
1
С чаем беда...
Эксперт CЭксперт С++
10014 / 5360 / 1467
Регистрация: 18.10.2014
Сообщений: 12,926
20.11.2019, 19:25 4
Цитата Сообщение от Алексей1153 Посмотреть сообщение
а чтобы не плясать со сдвигами:
... и получить нестандартный и непортируемый код.

Битовые поля не предназначены для подобных манипуляций и не гарантируют, что битовые последовательности "лягут" туда, куда вы их хотели поместить. Именно поэтому такие задачи решаются сдвигами и битовыми операциями, а ни в коем случае не битовыми полями.
1
фрилансер
4175 / 3584 / 801
Регистрация: 11.10.2019
Сообщений: 9,648
20.11.2019, 19:27 5
TheCalligrapher, что ж в них нестандартного, для чего же они тогда предназначены? Пока что проблем не встречал, использую часто
0
С чаем беда...
Эксперт CЭксперт С++
10014 / 5360 / 1467
Регистрация: 18.10.2014
Сообщений: 12,926
20.11.2019, 19:36 6
Цитата Сообщение от Алексей1153 Посмотреть сообщение
что ж в них нестандартного, для чего же они тогда предназначены?
Как это "для чего"? Назначение битовых полей, по-моему, вполне очевидно.

Битовые поля предназначены именно и только для экономии памяти: если вам нужна максимальная экономия памяти и вы знаете, что ваши значения поместятся в меньшее количество бит, чем предоставляется стандартными типами, вы можете воспользоваться битовыми полями, чтобы помочь компилятору упаковать несколько полей в одну единицу памяти. Вот и все. Никакого другого предназнаяения у битовых полей нет и никогда не было.

Абсолютно никаких гарантий по поводу того, как будут упакованы эти поля и как они будут располагаться относительно друг друга в языке нет и никогда не было, в том числе просто потому, что это совершенно не нужно в рамках вышеописанного назначения битовых полей. Любые применения битовые полей, которые зависят от их конкретного взаимного расположения - это "гамнокод".

P.S. Это еще не говоря о том, что вы в своем коде записали данные в одно поле union, а потом прочитали из другого - что тоже не разрешается в С++. (Это разрешено в С, но не в С++). Union для этого не предназначен.
0
Продавец времени
7129 / 4005 / 924
Регистрация: 12.03.2015
Сообщений: 18,847
20.11.2019, 19:36 7
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Битовые поля не предназначены для подобных манипуляций и не гарантируют, что битовые последовательности "лягут" туда, куда вы их хотели поместить.
Вот это новость!... Какие ваши доказательства?
Кликните здесь для просмотра всего текста


0
фрилансер
4175 / 3584 / 801
Регистрация: 11.10.2019
Сообщений: 9,648
20.11.2019, 19:40 8
TheCalligrapher, интересное заблуждение. Но я не заставляю пользоваться полями, однако сам с удовольствием продолжу и буду всем советовать

Добавлено через 2 минуты
TheCalligrapher, я бы лучше сформулировал так: если компилятор работает с битовыми полями не так, как от них обычно ждут, то такой компилятор не нужен.
0
С чаем беда...
Эксперт CЭксперт С++
10014 / 5360 / 1467
Регистрация: 18.10.2014
Сообщений: 12,926
20.11.2019, 19:57 9
Цитата Сообщение от Verevkin Посмотреть сообщение
Вот это новость!... Какие ваши доказательства?
Вот это новость... У языка С++ есть спецификация - стандарт. Вот и все доказательства )))

Сколько ни вбивай в головы эту уже заезженную вдоль и поперек тему о том, что бытовые поля ничего не гарантируют, все равно для кого-то это остается "новостью" и для кого-то нужно снова это "доказывать". Это просто какой-то фундаментальный мем мира С и С++ программирования.

Все эти темы все идут нога-в-ногу: "упаковка битовых полей никак не гарантировна", "union не предназначен для переинтерпретации памяти", "массив не является указателем" и еще масса аналогнов... Сколько их не вбивай в головы "пионэров-хацкеров", все равно откуда-то постоянно лезут новые ряды-и-колонны, для которых это "новость". Уже мегатонны объяснений, разъяснений, вдалбливаний, наставлений на эту тему написано... но все как об стенку горох.

Где-то в консерватории надо что-то править...

Добавлено через 5 минут
Цитата Сообщение от Алексей1153 Посмотреть сообщение
TheCalligrapher, интересное заблуждение.
Еще бы. Как я сказал выше, это заблуждение - это некий Кащей-Бессмертный среди "пионэров" от программирования. По мере того, как "пионэр" начинает что-то в чем-то смыслить в С и С++ программировании, эти заблуждения выветриваются, но на его место приходит новый "пионэр" с очередными "кул-хацкерскими" идеями о битовых полях.

Цитата Сообщение от Алексей1153 Посмотреть сообщение
Но я не заставляю пользоваться полями, однако сам с удовольствием продолжу и буду всем советовать
... но за такое ярко выраженное "пионэрство" вы всякий получать будете поправки разной степени вежливости от более опытных программистов (от нейтральных ссылок на стандарт языка до выраженного "по шапке" за невежественные советы).
0
фрилансер
4175 / 3584 / 801
Регистрация: 11.10.2019
Сообщений: 9,648
20.11.2019, 19:58 10
TheCalligrapher, теория теорией. А на практике это везде работает и это удобно. Если вдруг захотят из стандарта выкинуть поля, то им придётся сделать адекватную замену
0
С чаем беда...
Эксперт CЭксперт С++
10014 / 5360 / 1467
Регистрация: 18.10.2014
Сообщений: 12,926
20.11.2019, 20:10 11
Цитата Сообщение от Алексей1153 Посмотреть сообщение
теория теорией. А на практике это везде работает и это удобно.
На таких "на практике это везде работает" уже столько знаменитых на весь мир позорных эпизодов произошло, что народ уже научился не вляпываться в это наивное "на практике это везде работает" )))

Работает эти или не работает - это не важно, ибо это никому не нужно. Эту тему, как я сказал выше, всем уже подробно детально разъяснили. Никто уже сто лет как не пользуется битовыми полями для таких "хакерских" целей, ибо это неправильно и (!) нисколько не удобней обычных битовых операций. Если где-то в старинном "гамнокоде" такое вылавливают - то сразу стараются вычистить.

Цитата Сообщение от Алексей1153 Посмотреть сообщение
Если вдруг захотят из стандарта выкинуть поля, то им придётся сделать адекватную замену
Чего? А это откуда взялось? С чего бы это вдруг кто-то захочет "из стандарта выкинуть поля"???

Битовые поля имеют вполне конкретное предназначение, которое я описал выше и о котором вы можете прочитать где угодно. Именно для этого они и используются. И очень полезны в этой роли. Зачем их вдруг выкидывать???

А ваше безграмотное "хакерское" использование бытовых полей никто "выкинуть" не сможет, так как его никогда и не было.
0
Продавец времени
7129 / 4005 / 924
Регистрация: 12.03.2015
Сообщений: 18,847
20.11.2019, 20:12 12
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вот это новость... У языка С++ есть спецификация - стандарт.
Показывай. В нашем клубе на слово не верят, даже джентыльменам.
0
817 / 504 / 211
Регистрация: 19.01.2019
Сообщений: 1,196
20.11.2019, 20:14 13
https://en.cppreference.com/w/cpp/language/union
The union is only as big as necessary to hold its largest data member. The other data members are allocated in the same bytes as part of that largest member. The details of that allocation are implementation-defined, and it's undefined behavior to read from the member of the union that wasn't most recently written. Many compilers implement, as a non-standard language extension, the ability to read inactive members of a union.
0
С чаем беда...
Эксперт CЭксперт С++
10014 / 5360 / 1467
Регистрация: 18.10.2014
Сообщений: 12,926
20.11.2019, 20:15 14
Цитата Сообщение от Verevkin Посмотреть сообщение
Показывай. В нашем клубе на слово не верят, даже джентыльменам.
Мне надо начать брать стандартную таксу баксов эдак в 200 за элементарный гуглинг...

http://eel.is/c++draft/class.bit#1
https://en.cppreference.com/w/... /bit_field

Allocation of bit-fields within a class object is implementation-defined. Alignment of bit-fields is implementation-defined. Bit-fields are packed into some addressable allocation unit. [ Note: Bit-fields straddle allocation units on some machines and not on others. Bit-fields are assigned right-to-left on some machines, left-to-right on others. — end note ]
0
Продавец времени
7129 / 4005 / 924
Регистрация: 12.03.2015
Сообщений: 18,847
20.11.2019, 20:20 15
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Мне надо начать брать стандартную таксу баксов эдак в 200 за элементарный гуглинг...
Куда выслать гонорар?

Упаковка битовых групп
0
С чаем беда...
Эксперт CЭксперт С++
10014 / 5360 / 1467
Регистрация: 18.10.2014
Сообщений: 12,926
20.11.2019, 20:30 16
Цитата Сообщение от Алексей1153 Посмотреть сообщение
я бы лучше сформулировал так: если компилятор работает с битовыми полями не так, как от них обычно ждут, то такой компилятор не нужен.
Ваше утверждение эквивалентно огромной массе аналогичных утверждений:

- "Если переполнение знакового целого типа не будет вызывать обычного "заворота" значения, то такой компилятор не нужен"
- "Если memcpy копирует не слева направо, то такой компилятор не нужен"
- "Если компилятор не позволяет мне переинтерпретировать значение типа long как значение типа float, то такой компилятор не нужен"
- И т.д. и т.п.

Но на дворе 2019 и мы уже через все это прошли. У нас есть strict-overflow semantics, strict-aliasing semantics, хорошо всем известный скандал с memcpy в Firefox... Да, сначала откуда-то доносились недовольные вопли "пионэров"/"кул-хацкеров", когда компиляторы вот так вот постепенно заставляли их учить матчасть, но по этим воплям всегда прописывалась хорошая лупцовка ремнем и вопли затихали. И компилятор по-прежнему не только нужен, но его еще и активно хвалят за предпринятые усилия.

Ваша манера использования битовых полей ничем в этом списке не выделяется. Поэтому никаких проблем с компиляторами не будет.


Никто уже очень давно не ждет от битовых полей того, чего они них ждете вы. Это никому не нужно. Манера использовать битовые поля так, как вы использовали их в своем примере, уже настолько стигматизирована в С/С++ мире, что за такое использование поднимают на смех мгновенно. Поэтому у вас с вашим "я всегда буду советовать..." никаких шансов нет: в ответ вам будут лишь давать "по шапке" и советовать идти учить матчасть.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.11.2019, 20:30
Помогаю со студенческими работами здесь

Выяснить, верно ли, что в данном тексте больше групп букв, чем групп знаков
Помогите!Программа не работает. Дан текст, каждый символ которого может быть малой буквой, цифрой...

Есть строка, состоящая из групп нулей и единиц. Каждая группа отделяется друг от друга одним или несколькими пробелами. Найти и вывести на экран групп
Есть строка, состоящая из групп нулей и единиц. Каждая группа отделяется друг от друга одним или...

Массив битовых полей
Добрый день! Из файла читается массив 4-битовых значений т.е. по два значения в каждом байте....

Таблица битовых переходов
Доброго времени суток! Появилась необходимость замены битовых комбинаций по заранее сгенерированным...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru