LINUX.ORG.RU

битовые поля большого размера (+)


0

0

Писал тут софтинку одну
и в ходе ее написания столкнулся с такой сложностью
1) как в С содать тип данных размером более 8 байт
2) как проверить значение каждого бита этого типа ?
в текущий момент я делаю так
#define BIT40 549755813888
u_int64_t var;
if(var & num2flag(40)){ чето тут делаем }
функция num2flag возвращает значение с установленым
битом по номеру аргумента.....

Но вот я подошел к тому что мне нехватает уже
8 байт это раз, и опятьже надо как-то оперировать
с этим типом данных что тоже не представляю как делать
да и вобще мне кажется что я тут намурдир непонятно
чего и все можно делать проще :)

Можно конешно создать структуру с битовыми полями
но мне надо чекать поля по номеру бита.....
а писать функцию типа
int check_bit_256t(struct bit_256t *x, int bit_num){
switch(bit_num){
case 1:
if(x->bit1) == 1) return 1;
case 2:
if(x->bit2) == 1) return 1;
.
.
.
return 0;
}

мне кажется как-то неэстетично
думаю всеже есть другие способы...
да сражу оговорюсь критична производительность
нужен самый быстрый способ пусть даже не самый красивый

anonymous

а что-то типа 

get_bit( const uchar* a, int bitnum )
{
    int byte = bitnum >> 8;
    int bit = bitnum % 8;
    return !!(a[byte] & bit );
}

не катит?

devinull ★★
()
Ответ на: комментарий от devinull

> return !!(a[byte] & bit );

Побитовые логические операции: http://www.uniar.ukrnet.net/programming/kernigan/node33.html

Побитовые логические операции: http://hscool.net/online/base1_11.html

Кое-что забавное, для закрепления подхода к решению проблемы :) http://www.ispras.ru/%7Eigor/izin/BA_MS/05.html

Neksys ★★★
()
Ответ на: комментарий от Neksys

>return !!(a[byte] & bit );

Мдя, промахнулся, но для середины ночи это простительно.

return !!(a[byte] & ( 1 << bit ) );

devinull ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.