Re[2]: Выравнивание! Или как лучше это сделать?!
От: MaximE Великобритания  
Дата: 31.03.04 01:08
Оценка: 3 (1)
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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.