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.
Альтернатива:
template<unsigned bit, class T>
inline
bool bit_test(T const& t)
{
typedef char bit_argument_is_illegal[sizeof(T) * 8 > bit];
return (t & T(1) << bit) != 0;
}
//usage
bool b1 = bit_test<0>(1);
bool b2 = bit_test<63>(0xaa55aa55aa55aa55);
//bool b3 = bit_test<64>(0xaa55aa55aa55aa55);
--
Maxim Egorushkin
MetaCommunications Engineering
http://www.meta-comm.com/engineering/Posted via RSDN NNTP Server 1.8 beta