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

Нумерация битов в битовых полях - C++

Восстановить пароль Регистрация
 
 
anwender95
0 / 0 / 0
Регистрация: 31.03.2014
Сообщений: 10
31.03.2014, 16:19     Нумерация битов в битовых полях #1
Здравствуйте!
У меня есть битовое поле и юнион:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct bitfield{
    bool b0:1;
    bool b1:1;
    bool b2:1;
    bool b3:1;
    bool b4:1;
    bool b5:1;
    bool b6:1;
    bool b7:1;
    bool b8:1;
    bool b9:1;
    bool b10:1;
    bool b11:1;
    bool b12:1;
    bool b13:1;
    bool b14:1;
    bool b15:1;
};
union byte{
    bitfield p; //part
    short int a; //all
};
Меня интересует, можно ли обращаться к номерам битов через переменную?
Типа
C++
1
2
3
for(int i=0;i<15;i++){
word2.p.bi;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
31.03.2014, 16:24     Нумерация битов в битовых полях #2
Цитата Сообщение от anwender95 Посмотреть сообщение
можно ли обращаться к номерам битов через переменную?
Нельзя. Если просто нужен доступ к отдельным битам числа, то достаточно использовать соответствующие битовые операции (сдвиг, битовое-и...) вместо введения битовых полей.
anwender95
0 / 0 / 0
Регистрация: 31.03.2014
Сообщений: 10
31.03.2014, 16:29  [ТС]     Нумерация битов в битовых полях #3
Т.е. нельзя никаким способом выбирать бит по номеру из битового поля?
просто интереснее было бы так, а не через операции побитовые.
zss
Модератор
Эксперт С++
 Аватар для zss
5948 / 5553 / 1785
Регистрация: 18.12.2011
Сообщений: 14,191
Завершенные тесты: 1
31.03.2014, 16:59     Нумерация битов в битовых полях #4
Скорее всего получится. Но не факт, что b0 окажется младшим, а b15 старшим.
И с вычислительной точки зрения такое обращение к битам займет больше
процессорного времени.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,334
Завершенные тесты: 1
31.03.2014, 17:00     Нумерация битов в битовых полях #5
Цитата Сообщение от zss Посмотреть сообщение
Скорее всего получится, но не факт
Что-то я сейчас на коленке через массив попробовал, и что-то совсем не факт. Но ведь запускал как-то.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
31.03.2014, 17:03     Нумерация битов в битовых полях #6
C++
1
word2.p.bi;
думаю, что тебе скажут, что bi не является членом класса bitfield
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
31.03.2014, 17:08     Нумерация битов в битовых полях #7
Цитата Сообщение от aLarman Посмотреть сообщение
думаю, что тебе скажут, что bi не является членом класса bitfield
Тут ТС хочет чтобы i интерпретировался как индекс (т.к. в примере используется в массиве).
anwender95, можно рассмотреть использование std::bitset
anwender95
0 / 0 / 0
Регистрация: 31.03.2014
Сообщений: 10
31.03.2014, 17:36  [ТС]     Нумерация битов в битовых полях #8
эх. А отдельно каждую переменную в битфилде пронумеровать и юзать по номерам нельзя?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
31.03.2014, 17:45     Нумерация битов в битовых полях #9
Цитата Сообщение от anwender95 Посмотреть сообщение
А отдельно каждую переменную в битфилде пронумеровать и юзать по номерам нельзя?
Нельзя. Либо пишите своё обёртку, либо используйте std::bitset.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,334
Завершенные тесты: 1
01.04.2014, 14:53     Нумерация битов в битовых полях #10
Цитата Сообщение от Tulosba Посмотреть сообщение
пишите своё обёртку
Что-то у меня никак не получается отделаться малой кровью. Засунуть-то в структуру set/get методы можно, но это не даст гибкости как, к примеру, у оператора квадратных скобок. Тяжко без адресной арифметики.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
01.04.2014, 15:10     Нумерация битов в битовых полях #11
Цитата Сообщение от SatanaXIII Посмотреть сообщение
к примеру, у оператора квадратных скобок.
Что мешает перегрузить operator[] ?
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,334
Завершенные тесты: 1
01.04.2014, 15:14     Нумерация битов в битовых полях #12
Цитата Сообщение от Tulosba Посмотреть сообщение
Что мешает перегрузить operator[] ?
То, что у бита нет адреса. Не получится перегрузить &operator[].
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
01.04.2014, 15:21     Нумерация битов в битовых полях #13
Цитата Сообщение от SatanaXIII Посмотреть сообщение
То, что у бита нет адреса. Не получится перегрузить &operator[].
с кучей if возвращать bi в зависимости от вх.значения индекса, но это жесть
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,334
Завершенные тесты: 1
01.04.2014, 15:25     Нумерация битов в битовых полях #14
Цитата Сообщение от aLarman Посмотреть сообщение
с кучей if возвращать bi в зависимости от вх.значения индекса, но это жесть
Ну, положим, не кучей ифов, а кейсом. Но вы попробуйте реализовать.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
01.04.2014, 15:47     Нумерация битов в битовых полях #15
Цитата Сообщение от SatanaXIII Посмотреть сообщение
а кейсом
согласен
C++
1
2
3
4
5
6
7
8
9
10
bool & operator[](size_t index)
{
switch(index)
{
case 0: return b0;
case 1: return b1;
///
default: return b15;
}
}
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,334
Завершенные тесты: 1
01.04.2014, 15:54     Нумерация битов в битовых полях #16
aLarman, почти хорошо. Осталось только сделать тоже самое, только чтобы оператор возвращал не ссылку, а копию. Битовое поле-то по ссылке нельзя получить. Было бы можно работать с адресами полей, то легче было бы в union массив добавить и всех делов.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
01.04.2014, 15:56     Нумерация битов в битовых полях #17
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Битовое поле-то по ссылке нельзя получить
я ними не работал почти, не знал такого
DrOffset
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,626
01.04.2014, 16:31     Нумерация битов в битовых полях #18
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Битовое поле-то по ссылке нельзя получить.
Да это не обязательно. Да и вообще, сдается мне, битовое поле тут нафиг не упало (кому нужны проблемы с union и выравниванием?). Коли уж так хочется итерировать биты, вот накидал на коленке. В ассемблере никакого криминала не обнаружил. Хорошо оптимизируется, вплоть до подстановки константы, в случае если биты задаются inplace.
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
template <typename T>
class bitfield
{
    class bitfield_proxy
    {
        friend class bitfield;
 
        bitfield_proxy(bitfield & ctrl, size_t idx)
            : ctrl_(ctrl), shifted_(T(1) << idx)
        { }
        bitfield_proxy(bitfield_proxy const & x)
            : ctrl_(x.ctrl_), shifted_(x.shifted_)
        {}
 
        bitfield_proxy & operator=(bitfield_proxy const &);
 
        bitfield & ctrl_;
        const T    shifted_;
 
    public:
        void operator=(bool bit)
        {
             bit ? ctrl_.data_ |= shifted_ : ctrl_.data_ &= ~shifted_;
        }
        operator bool() const
        {
            return ctrl_.data_ & shifted_;
        }
    };
 
    T data_;
 
public:
    bitfield(T data = T())
        : data_(data)
    {}
 
    bool operator[](size_t idx) const
    {
        return data_ & (T(1) << idx);
    }
    bitfield_proxy operator[](size_t idx)
    {
        return bitfield_proxy(*this, idx);
    }
    size_t size() const
    {
        return sizeof(T) / 8; // Вместо 8, кошернее будет CHAR_BITS
    }
    T value() const
    {
        return data_;
    }
};
 
short int test()
{
    bitfield<short int> bits;
 
    bits[3] = 0;
    bits[2] = 1;
    bits[1] = 1;
    bits[0] = 1;
 
    return bits.value();
}
 
int main()
{
    short int v = test();
 
    printf("value: %d\n", v);
}
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
01.04.2014, 16:34     Нумерация битов в битовых полях #19
Цитата Сообщение от SatanaXIII Посмотреть сообщение
То, что у бита нет адреса. Не получится перегрузить &operator[].
Всё же это разные вещи, получать доступ на чтение/запись некоторого бита и пытаться (безуспешно) вернуть ссылку или указатель на бит.
Тут, кстати, сразу вспоминается реализация std::vector<bool>, где для минимизации памяти использовали биты для хранения значений.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.04.2014, 16:36     Нумерация битов в битовых полях
Еще ссылки по теме:

Выполнение битовых логических операций C++
Реализация битовых операций в Си++ C++
C++ Уточнение о полях структуры

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

Или воспользуйтесь поиском по форуму:
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,334
Завершенные тесты: 1
01.04.2014, 16:36     Нумерация битов в битовых полях #20
DrOffset, смысл был в том, чтобы создать удобный интерфейс работы с битовым полем по его номеру, без использования сдвигов. В идеале как по индексу.
Yandex
Объявления
01.04.2014, 16:36     Нумерация битов в битовых полях
Ответ Создать тему
Опции темы

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