URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8896
[ Назад ]

Исходное сообщение
"Как сделать доступ к битам переменной?"

Отправлено yantux , 14-Окт-10 21:25 
Хочу сделать с помощью полей union, доступ к каждому биту поля типа int.

#include <stdio.h>

union int_bin {
int a : 1 __attribute__ ((packed)); //переменная типа int состоящая из одного бита
} __attribute__ ((packed));

union arr_int_bin {
union int_bin a[32] __attribute__ ((packed)); //массив, я бы хотел, чтобы он занимал
// 4 байта, а не 32, как сейчас, что я делаю не так?
int d;
} __attribute__ ((packed));;

union arr_int_bin data __attribute__ ((packed));

int main( void ) {

    printf("sizeof(int)=%d\n", sizeof(int));
    printf("sizeof(union int_bin)=%d\n", sizeof(union int_bin));
    printf("sizeof(union arr_int_bin)=%d\n", sizeof(union arr_int_bin));
    printf("sizeof(data)=%d\n", sizeof(data));

    return( 0 );
}


Почему компилятор не пропускает конструкцию типа:
union int_bin{
int d;
int s[32] : 1; //почему компилятор ругается на массив? как это исправить?

}__attribute__ ((packed));;


Содержание

Сообщения в этом обсуждении
"Как сделать доступ к битам переменной?"
Отправлено yantux , 14-Окт-10 21:26 
Мой результат работы программы:

sizeof(int)=4
sizeof(union int_bin)=1
sizeof(union arr_int_bin)=32
sizeof(data)=32


"Как сделать доступ к битам переменной?"
Отправлено yantux , 14-Окт-10 21:28 
Я бы хотел, чтобы union arr_int_bin занимал в памяти 4 байта, а не 32, как сейчас. Что я делаю не так?

"Как сделать доступ к битам переменной?"
Отправлено parad , 15-Окт-10 01:47 
минимальная единица работы с памятью байт, а не бит. нельзя создать переменную размером один бит.

"Как сделать доступ к битам переменной?"
Отправлено pavlinux , 17-Дек-10 21:13 
> Я бы хотел, чтобы union arr_int_bin занимал в памяти 4 байта, а
> не 32, как сейчас. Что я делаю не так?

0b00000000000000000000000000000100


"Как сделать доступ к битам переменной?"
Отправлено guest , 15-Окт-10 09:46 
> union arr_int_bin {
>  union int_bin a[32] __attribute__ ((packed)); //массив, я бы хотел, чтобы он
> занимал
> // 4 байта, а не 32, как сейчас, что я делаю не
> так?

32 элемента размером 1 байт каждый в 4 байта ну ни как не запихать.

> Почему компилятор не пропускает конструкцию типа:
> union int_bin{
> int d;
> int s[32] : 1; //почему компилятор ругается на массив? как это исправить?

Язык Cи не разрешает объявлять массивы bit-field, применять к ним & и *.

Не поленитесь и тупо напишите что-то такое
struct bits32 {
        unsigned b1     : 1;
        unsigned b2     : 1;
        unsigned b3     : 1;
...
        unsigned b31    : 1;
        unsigned b32    : 1;
};
union int_bin {
        int32_t a;
        struct bits32 b;
}


"Как сделать доступ к битам переменной?"
Отправлено Аноним , 15-Окт-10 10:36 
>> union arr_int_bin {
>>  union int_bin a[32] __attribute__ ((packed)); //массив, я бы хотел, чтобы он
>> занимал
>> // 4 байта, а не 32, как сейчас, что я делаю не
>> так?
> 32 элемента размером 1 байт каждый в 4 байта ну ни как
> не запихать.

В том то и дело, я бы хотел, чтобы 32 бита занимали 4 байта, а не 32

> Язык Cи не разрешает объявлять массивы bit-field, применять к ним & и
> *.

Жаль, плохая новость. А в С++ подобное возможно?

>[оверквотинг удален]
> ...
>         unsigned b31  
>  : 1;
>         unsigned b32  
>  : 1;
> };
> union int_bin {
>         int32_t a;
>         struct bits32 b;
> }

Придётся делать так, но получается, что не возможно будет обращаться к битам в цикле (((
Лень тут не при чём.


"Как сделать доступ к битам переменной?"
Отправлено guest , 15-Окт-10 11:45 
> Жаль, плохая новость. А в С++ подобное возможно?

Неа.

> Придётся делать так, но получается, что не возможно будет обращаться к битам
> в цикле (((

А что вы хотите в итоге получить?
Например как вариант можно вообще забыть про bit-fields и работать с масками взяв за основу макросы FD_* от select().


"Как сделать доступ к битам переменной?"
Отправлено аноним , 26-Окт-10 19:51 
> Неа.

Бред. Сделайте класс, перегрузите [] и работайте с битами. std::vector<bool> так и сделан.


"Как сделать доступ к битам переменной?"
Отправлено guest , 26-Окт-10 22:24 
> Бред. Сделайте класс, перегрузите [] и работайте с битами. std::vector<bool> так и
> сделан.

Кусочек CPP стандарта для тех кто путает теплое с мягким:
The address-of operator & shall not be applied to a bit-field, so there are no pointers to bit-fields.

за одно можете посмотреть как устроен внутри vector.


"Как сделать доступ к битам переменной?"
Отправлено Аноним , 19-Окт-10 18:20 
> Придётся делать так, но получается, что не возможно будет обращаться к битам
> в цикле (((

младший бит:
bit = var & 0x00000001
второй:
var & 0x00000002
третий:
var & 0x00000004

и так далее...
var & 0x00000008
var & 0x00000010


> Лень тут не при чём.

да что вы говорите!
прочтите уже книжку или сидите в своём пхп.


"Как сделать доступ к битам переменной?"
Отправлено pavlinux , 09-Янв-11 23:15 
>[оверквотинг удален]
>> в цикле

Как вариант

младший бит:
bit = var & 0b00000001
второй:
      var & 0b00000010
третий:
      var & 0b00000100
и так далее...
      var & 0b00001000
      var & 0b00010000