The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Как сделать доступ к битам переменной?"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Изначальное сообщение [ Отслеживать ]

"Как сделать доступ к битам переменной?"  +/
Сообщение от yantux (??) on 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));;

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Как сделать доступ к битам переменной?"  +/
Сообщение от yantux (??) on 14-Окт-10, 21:26 
Мой результат работы программы:

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Как сделать доступ к битам переменной?"  +/
Сообщение от yantux (??) on 14-Окт-10, 21:28 
Я бы хотел, чтобы union arr_int_bin занимал в памяти 4 байта, а не 32, как сейчас. Что я делаю не так?
Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Как сделать доступ к битам переменной?"  +/
Сообщение от parad (ok) on 15-Окт-10, 01:47 
минимальная единица работы с памятью байт, а не бит. нельзя создать переменную размером один бит.
Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

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

0b00000000000000000000000000000100

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "Как сделать доступ к битам переменной?"  +/
Сообщение от guest email(??) on 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;
}

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

5. "Как сделать доступ к битам переменной?"  +/
Сообщение от Аноним (??) on 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;
> }

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

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

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

Неа.

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

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

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

9. "Как сделать доступ к битам переменной?"  +/
Сообщение от guest email(??) on 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.

Ответить | Правка | ^ к родителю #8 | Наверх | Cообщить модератору

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

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

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


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

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

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

11. "Как сделать доступ к битам переменной?"  +/
Сообщение от pavlinux (ok) on 09-Янв-11, 23:15 
>[оверквотинг удален]
>> в цикле

Как вариант

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

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру