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

Битовые поля - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.62
Sasuke
 Аватар для Sasuke
0 / 0 / 0
Регистрация: 09.10.2009
Сообщений: 89
28.02.2010, 00:05     Битовые поля #1
Подскажите пожалуйста, как мне сохранить две цифры с помощью битовых полей?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.02.2010, 00:05     Битовые поля
Посмотрите здесь:

C++ Битовые поля
C++ Битовые поля
битовые поля C++
Битовые поля C++
C++ Битовые поля
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Amarted
 Аватар для Amarted
157 / 19 / 2
Регистрация: 26.02.2010
Сообщений: 56
28.02.2010, 02:54     Битовые поля #2
Немного непонятен вопрос, куда тебе что нужно сохранить? или имеешь в виду с помощью битовых полей установить две цифры, всмысле как два флага ( 1 или 0), поконкретней напиши.
Sasuke
 Аватар для Sasuke
0 / 0 / 0
Регистрация: 09.10.2009
Сообщений: 89
28.02.2010, 11:56  [ТС]     Битовые поля #3
Я не совсем понимаю логику битовых полей, но в моём представлении они имеют такой вид:
берём число, например, 100, и разбиваем его на "битовые поля (в данном случаи на две части)" -->
--> 100(10)==00110100(2).
--> 0011(2)==3(10)
--> 0100(2)==4(10)

Вот эти 3 и 4 мне и нужно сначала сохранить в двоичное число, а потом его разбить и вывести эти две цифры. Но моя логика, где-то глубоко внутри меня, говорит, что битовые поля имеют совсем другое представление… **
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
28.02.2010, 12:30     Битовые поля #4
битовое поле - это когда в переменной типа unsigned int резервируется какое-то число битов
обычно ему даётся имя
в результате переменная используется не вся, а лишь частично

C
1
2
3
4
5
6
7
8
9
10
11
struct bits {
    unsigned int one : 4;
    unsigned int two : 4;
};
 
...
 
    struct bits fields;
 
    fields.one = 3;
    fields.two = 4;
мы берём четыре бита потому что сохраняем одну цифру до десяти
размер этой структуры будет равен размеру sizeof(unsigned int) потому что эти поля зарезервированы в одной переменной
Sasuke
 Аватар для Sasuke
0 / 0 / 0
Регистрация: 09.10.2009
Сообщений: 89
28.02.2010, 12:43  [ТС]     Битовые поля #5
Я правильно понимаю... Получается, если бы это всё происходило без битовых полей, с использование структуры, то я бы резервировал для переменной fields 4 байта (ибо sizeof(unsigned int)=2, а поля у структуры два. Итого => 4 байта). Но, если я использую битовые поля, эта переменная занимает только 2 байта. Верно?
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
28.02.2010, 13:14     Битовые поля #6
если используются битовые поля, они резервируются в одной переменной
поэтому размер структуры будет равен размеру структуры для одной переменной типа unsigned int

C
1
2
3
4
struct {
    unsigned int a : 4;
    unsigned int b : 4;
} s1;
C
1
2
3
struct {
    unsigned int n;
} s2;
sizeof s1 == sizeof s2
Sasuke
 Аватар для Sasuke
0 / 0 / 0
Регистрация: 09.10.2009
Сообщений: 89
28.02.2010, 20:29  [ТС]     Битовые поля #7
accept, большое спасибо за объяснения.)

Добавлено через 35 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream> 
#include <cstring> 
using namespace std; 
 
 
struct 
{ 
    unsigned int one: 4; 
    unsigned int two: 4;
} bcd; 
 
int main() 
{ 
    сin>>bcd.one>>bcd.two;
    cout<<"\n\nResult\n";
    cout<<"\nOne: "<<bcd.one; 
    cout<<"\nTwo: "<<bcd.two;
    cout<<'\n';
   return 0; 
}
Подскажите, пожалуйста, почему не работает..?

Добавлено через 2 часа 49 минут
Подскажите, пожалуйста, что не так в это коде! Очень срочно нужно...

Добавлено через 2 часа 51 минуту
... ... ...
insideone
Модератор
Автор FAQ
 Аватар для insideone
3623 / 901 / 48
Регистрация: 10.01.2010
Сообщений: 2,429
28.02.2010, 22:00     Битовые поля #8
Видно не умеет считывать cin в такие переменные....
Вот так работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream> 
using namespace std; 
 
struct 
{ 
    unsigned int one: 4; 
        unsigned int two: 4;
} bcd; 
 
int main() 
{ 
    unsigned int a;
        cin >> a;
        bcd.one = a;
        cin >> a;
        bcd.two = a;
 
        cout<<"\n\nResult\n";
        cout<<"\nOne: "<<bcd.one; 
        cout<<"\nTwo: "<<bcd.two;
        cout<<'\n';
   return 0; 
}
Sasuke
 Аватар для Sasuke
0 / 0 / 0
Регистрация: 09.10.2009
Сообщений: 89
01.03.2010, 22:52  [ТС]     Битовые поля #9
insideone, спасибо огромное.))

Добавлено через 21 час 52 минуты
Еще вопрос. Подскажите, пожалуйста, можно ли создать массив, а не переменную, этой структуры? И будет ли она эффективно работать? Просто когда я делаю массив, то у меня первый раз поля заполняются нормально, а вот второй прерывается ошибкой... Не пойму в чём проблема... Подскажите, молю...
insideone
Модератор
Автор FAQ
 Аватар для insideone
3623 / 901 / 48
Регистрация: 10.01.2010
Сообщений: 2,429
01.03.2010, 23:57     Битовые поля #10
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
#include <iostream> 
using namespace std; 
 
struct 
{ 
    unsigned int one: 16; // половинка unsigned int это 16
    unsigned int two: 16;
} bcd[10]; 
 
int main() 
{ 
        for (unsigned int i = 0; i < 10; i++)
        {
            bcd[i].one = i; bcd[i].two = i * 2;
        }
 
        for (unsigned int i = 0; i < 10; i++)
        {
            cout
                << "[" << i << "] One: " << bcd[i].one
                << "; Two: " << bcd[i].two << ";" << endl;
        }
return 0; 
}
Вот кажется и массивчик сработал. Нужно обратить внимание что в unsigned int 4 байта а значит 4 * 8 бит...
Sasuke
 Аватар для Sasuke
0 / 0 / 0
Регистрация: 09.10.2009
Сообщений: 89
02.03.2010, 00:03  [ТС]     Битовые поля #11
Спасисбо.)) Сейчас буду пробовать использовать.))
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
02.03.2010, 00:09     Битовые поля #12
Sasuke, Простите, может я чего не понял
100(10)==00110100(2).
Но ИМХО, 100(10) = 0110 0100(2) = 64(16)
Хмм. Любопытно. 100(8) = 64(10). Может тут есть какой закон ?
Sasuke
 Аватар для Sasuke
0 / 0 / 0
Регистрация: 09.10.2009
Сообщений: 89
02.03.2010, 00:19  [ТС]     Битовые поля #13
Цитата Сообщение от Day Посмотреть сообщение
Sasuke, Простите, может я чего не понял
Но ИМХО, 100(10) = 0110 0100(2) = 64(16)
Прошу прощение за неверный перевод.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2010, 03:14     Битовые поля
Еще ссылки по теме:

C++ Битовые поля
C++ Битовые поля
Битовые поля C++

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

Или воспользуйтесь поиском по форуму:
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
02.03.2010, 03:14     Битовые поля #14
Цитата Сообщение от insideone
C++
1
unsigned int one: 16; // половинка unsigned int это 16
у него int двухбайтовый

Цитата Сообщение от Sasuke
ибо sizeof(unsigned int)=2
Yandex
Объявления
02.03.2010, 03:14     Битовые поля
Ответ Создать тему
Опции темы

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