Очень хочется, что бы эта структура занимала 2 байта, а не
получается? Можно ли это сделать и если нельзя, то как более
удобно осушествлять доступ к значениям битов, если учесть, что
эта стуктура тривиальная, а их еще 16 и далеко не все переменные
однобитовые.
Здравствуйте, Tarhall, Вы писали:
T>Есть структура:
T>typedef struct _HARDWARE_CONT_02{ T> BYTE command; // Код команды посылки T> unsigned lamp :1; // Лампочка T> unsigned zero_02_08 :7; // Резерв 0 T> _HARDWARE_CONT_02() { command=0x22; zero_02_08=0; }; T>} H_CONT_02, *LPH_CONT_02; T>Очень хочется, что бы эта структура занимала 2 байта, а не T>получается? Можно ли это сделать и если нельзя, то как более T>удобно осушествлять доступ к значениям битов, если учесть, что T>эта стуктура тривиальная, а их еще 16 и далеко не все переменные T>однобитовые.
Не... Два байта она занимать не будет в любом случае — минимальная
адрессуемая еденица информации — байт, но никак не бит.
А доступ — макрос вида:
Например:
// x - переменная, в которой надо протестить бит (любой целочисленный тип)
// y - номер бита (с нуля) (строго char)
// я - переменная, куда помещать результат ( строго char)#define get_bit(x, y, z) __asm xor edx, edx \
__asm movzx eax, x \
__asm bt eax, y \
__asm adc dl, 0x00 \
__asm mov byte ptr [z], dl
Заюзать это можно так:
int a = 0x0a; // (0000.1010)int b = 0;
get_bit(a, 1, b);
// имеем в b еденницу
valytch wrote:
> Не... Два байта она занимать не будет в любом случае — минимальная > адрессуемая еденица информации — байт, но никак не бит.
Предожение как-то противоречит само себе.
> А доступ — макрос вида: > >
> // x - переменная, в которой надо протестить бит (любой целочисленный тип)
> // y - номер бита (с нуля) (строго char)
> // я - переменная, куда помещать результат ( строго char)
> #define get_bit(x, y, z) __asm xor edx, edx \
> __asm movzx eax, x \
> __asm bt eax, y \
> __asm adc dl, 0x00 \
> __asm mov byte ptr [z], dl
>
> > Заюзать это можно так: >
> int a = 0x0a; // (0000.1010)
> int b = 0;
>
> get_bit(a, 1, b);
> // имеем в b еденницу
>
Макрос не работает с любым целочисленным типом, например с long long, абсолютно не типобезопасен, допускает любые числа как номер бита, и, что удивительно, не работает на PowerPC.
Здравствуйте, MaximE, Вы писали:
ME>Макрос не работает с любым целочисленным типом, например с long long, абсолютно не типобезопасен, допускает любые числа как номер бита, и, что удивительно, не работает на PowerPC.
Здравствуйте, MaximE, Вы писали:
ME>valytch wrote:
>> Не... Два байта она занимать не будет в любом случае — минимальная >> адрессуемая еденица информации — байт, но никак не бит. ME>Предожение как-то противоречит само себе.
В чём же противоречие? Бит адресовать нельзя! Когда ты в структуре объявляеш
поле в n-бит, в памяти оно будет занимать ЦЕЛОЕ число байт... Так ясно?
>> А доступ — макрос вида: >> >>
>> // x - переменная, в которой надо протестить бит (любой целочисленный тип)
>> // y - номер бита (с нуля) (строго char)
>> // я - переменная, куда помещать результат ( строго char)
>> #define get_bit(x, y, z) __asm xor edx, edx \
>> __asm movzx eax, x \
>> __asm bt eax, y \
>> __asm adc dl, 0x00 \
>> __asm mov byte ptr [z], dl
>>
>> >> Заюзать это можно так: >>
>> int a = 0x0a; // (0000.1010)
>> int b = 0;
>>
>> get_bit(a, 1, b);
>> // имеем в b еденницу
>>
ME>Макрос не работает с любым целочисленным типом, например с long long, абсолютно не типобезопасен, допускает любые числа как номер бита, и, что удивительно, не работает на PowerPC.
ME>Альтернатива:
ME>[c] ME>template<unsigned bit, class T> ME>inline ME>bool bit_test(T const& t) ME>{ ME> typedef char bit_argument_is_illegal[sizeof(T) * 8 > bit]; ME> return (t & T(1) << bit) != 0; ME>}
Согласен, так ^^^^ оно конечно лучше, но!
Начнём с того, что в вопросе нигде о PowerPC не было
сказано ни слова, ровно как и о платформонезависимости...
Поверь на слово, на x86 он работает замечательно...
Хотя, согласен, форум-то по c++, но такая уж у меня привычка
с детства — зачем писать на с то, что можно написать на паре-тройке
ассемблерных комманд? А типобезопасность... Для такой элементарной
операции не вижу в этом никакого смысла... Хотя, это моё личное мнение...
valytch wrote:
> Начнём с того, что в вопросе нигде о PowerPC не было > сказано ни слова, ровно как и о платформонезависимости...
В вопросе также не было ни слова про x86.
> Поверь на слово, на x86 он работает замечательно...
Верю.
> Хотя, согласен, форум-то по c++, но такая уж у меня привычка > с детства — зачем писать на с то, что можно написать на паре-тройке > ассемблерных комманд?
Сомневаюсь в полезности такой привычки — с компилятором (VC 7.1, /O2 /G7) соперничать в генерации кода — неблагодарное занятие:
Здравствуйте, MaximE, Вы писали:
ME>valytch wrote: >> Начнём с того, что в вопросе нигде о PowerPC не было >> сказано ни слова, ровно как и о платформонезависимости... ME>В вопросе также не было ни слова про x86. >> Поверь на слово, на x86 он работает замечательно... ME>Верю. >> Хотя, согласен, форум-то по c++, но такая уж у меня привычка >> с детства — зачем писать на с то, что можно написать на паре-тройке >> ассемблерных комманд? ME>Сомневаюсь в полезности такой привычки — с компилятором (VC 7.1, /O2 /G7) соперничать в генерации кода — неблагодарное занятие:
[утеряно]
Убедительно...
>> Согласись, на вопрос я же всё таки ответил? ME>Соглашусь.
Ну и я соглашусь, что мой вариант это всего лишь вариант...
Хотя, а что в этом мире совершенено? Компилятор MS VC 7.1?
Здравствуйте, valytch, Вы писали:
V> Ну и я соглашусь, что мой вариант это всего лишь вариант... V> Хотя, а что в этом мире совершенено? Компилятор MS VC 7.1?