Доброго времени суток!
Вот такой вопрос: необходимо записать в отдельные группы битов отдельные числа (например, при создании заголовка MP3-файла ). Используем C++, так что в теории можно и с bitset поизвращаться. А если вот так:
// Предполагается, что это - 16-разрядное число,
// нам нужно записать данные в его младшие 5 бит, в следующие за ними 7 бит,
// и в старшие 4 битаtypedef usigned short WORD;
typedef struct Foo
{
WORD bar: 5; // Младшие 5 бит
WORD baz: 7; // Следующие 7 бит
WORD bah: 4; // Старшие 4 бита
};
Foo foo;
foo.bar = 7;
foo.baz = 19;
foo.bah = 3;
WORD foo1 = (WORD)foo; // Забираем данные в "нормальную" переменную типа WORD
Такое возможно, или оно не будет компилиться/работать/переноситься (например, из-за гемора с big и little endian)?
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
Здравствуйте, Alexander G, Вы писали:
AG>Кастом указателей? Это в ограничения 3.10/15 вписывается?
х.з., не могу похвастаться хорошим знанием стандарта (ибо: 1.компиляторов соответствующих стандарту на 100% не существует; 2.прочитавшего текст стандарта полностью и до конца можно сразу класть в НИИ Сербского на обследование ). GCC 4.1.2 без замечаний принимает вот такое:
#include <iostream>
#include <iomanip>
using namespace std;
typedef unsigned WORD;
typedef struct Foo
{
WORD bar: 4;
WORD baz: 4;
WORD bah: 8;
};
int main(int argc, char* argv[])
{
Foo foo;
foo.bar = 0xF;
foo.baz = 0xA;
foo.bah = 0x3F;
WORD foo2 = *(
static_cast<WORD*>(
static_cast<void*>(&foo)
)
);
cout << hex << foo2 << endl;
return 0;
}
и на выходе дает 3a3faf
Впрочем, вопрос уже отпадает — по причинам, описанным в этой же теме выше.
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
Здравствуйте, slava_phirsov, Вы писали:
_> GCC 4.1.2 без замечаний принимает вот такое:
А зачем такие страшные касты, когда есть [без]именные объединения (union'ы)? Вопрос риторический, т.к. тема исчерпана, судя по всему )
Здравствуйте, slava_phirsov, Вы писали:
AG>>Кастом указателей? Это в ограничения 3.10/15 вписывается?
_> х.з., не могу похвастаться хорошим знанием стандарта (ибо: 1.компиляторов соответствующих стандарту на 100% не существует; 2.прочитавшего текст стандарта полностью и до конца можно сразу класть в НИИ Сербского на обследование ). GCC 4.1.2 без замечаний принимает вот такое: