Хочу сделать с помощью полей 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));;
Мой результат работы программы:sizeof(int)=4
sizeof(union int_bin)=1
sizeof(union arr_int_bin)=32
sizeof(data)=32
Я бы хотел, чтобы union arr_int_bin занимал в памяти 4 байта, а не 32, как сейчас. Что я делаю не так?
минимальная единица работы с памятью байт, а не бит. нельзя создать переменную размером один бит.
> Я бы хотел, чтобы union arr_int_bin занимал в памяти 4 байта, а
> не 32, как сейчас. Что я делаю не так?0b00000000000000000000000000000100
> 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;
}
>> 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;
> }Придётся делать так, но получается, что не возможно будет обращаться к битам в цикле (((
Лень тут не при чём.
> Жаль, плохая новость. А в С++ подобное возможно?Неа.
> Придётся делать так, но получается, что не возможно будет обращаться к битам
> в цикле (((А что вы хотите в итоге получить?
Например как вариант можно вообще забыть про bit-fields и работать с масками взяв за основу макросы FD_* от select().
> Неа.Бред. Сделайте класс, перегрузите [] и работайте с битами. std::vector<bool> так и сделан.
> Бред. Сделайте класс, перегрузите [] и работайте с битами. 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.
> Придётся делать так, но получается, что не возможно будет обращаться к битам
> в цикле (((младший бит:
bit = var & 0x00000001
второй:
var & 0x00000002
третий:
var & 0x00000004и так далее...
var & 0x00000008
var & 0x00000010
> Лень тут не при чём.да что вы говорите!
прочтите уже книжку или сидите в своём пхп.
>[оверквотинг удален]
>> в циклеКак вариант
младший бит:
bit = var & 0b00000001
второй:
var & 0b00000010
третий:
var & 0b00000100
и так далее...
var & 0b00001000
var & 0b00010000