Задача похожа на
этуАвтор: Vladik
Дата: 15.12.02
, но другие параметры.
параметр
mask_value — либо ноль, либо равен mask
mask — содержит ровно один бит установленный в 1.
надо установить или сбросить соответствующий бит в byte.
Можно ли обойтись без условного оператора?
unsigned char assign_bit(unsigned char byte, unsigned char mask, unsigned char mask_value)
{
assert(0 != mask);
assert(mask == mask_value || 0 == mask_value);
assert(0x01 == mask ||
0x02 == mask ||
0x04 == mask ||
0x08 == mask ||
0x10 == mask ||
0x20 == mask ||
0x40 == mask ||
0x80 == mask
);
if ( !mask_value )
byte &= ~mask;
else
byte |= mask;
return byte;
}
Короче, хочу битовую функцию вида:
x ∈ { 0, 1 }
f(x, 0, 0) -> x
f(x, 1, 0) -> 0
f(x, 1, 1) -> 1
f(x, 0, 1) -> undefined
(byte & ~mask) | mask_value
Здравствуйте, B0FEE664, Вы писали:
BFE>Задача похожа на этуАвтор: Vladik
Дата: 15.12.02
, но другие параметры.
BFE>параметр
BFE>mask_value — либо ноль, либо равен mask
BFE>mask — содержит ровно один бит установленный в 1.
BFE>надо установить или сбросить соответствующий бит в byte.
BFE>Можно ли обойтись без условного оператора?
BFE>BFE>unsigned char assign_bit(unsigned char byte, unsigned char mask, unsigned char mask_value)
BFE>{
BFE> assert(0 != mask);
BFE> assert(mask == mask_value || 0 == mask_value);
BFE> assert(0x01 == mask ||
BFE> 0x02 == mask ||
BFE> 0x04 == mask ||
BFE> 0x08 == mask ||
BFE> 0x10 == mask ||
BFE> 0x20 == mask ||
BFE> 0x40 == mask ||
BFE> 0x80 == mask
BFE> );
BFE> if ( !mask_value )
BFE> byte &= ~mask;
BFE> else
BFE> byte |= mask;
BFE> return byte;
BFE>}
BFE>
BFE>Короче, хочу битовую функцию вида:
BFE>BFE>x ∈ { 0, 1 }
BFE>f(x, 0, 0) -> x
BFE>f(x, 1, 0) -> 0
BFE>f(x, 1, 1) -> 1
BFE>f(x, 0, 1) -> undefined
BFE>
Без условного оператора можно, только вряд ли это будет быстрее:
пусть есть set_clear (1/0) флаг и mask с установленным нужным битом:
x = (x | mask) — mask + set_clear*mask;
ну и в твоих обозначениях:
A>x = (x | mask) — mask + mask_value;
Здравствуйте, collider, Вы писали:
C>думаю лучше будет
C>assert(0 != mask && 0x80%mask==0 );
еще можно так
assert(mask && !(mask & (mask - 1)));
зы: не проверял
Здравствуйте, watch-maker, Вы писали:
WM>(byte & ~mask) | mask_value
Наиболее универсальное выражение, которым можно обрабатывать не только одиночные биты, но и группы битов, выглядит так:
(byte & ~mask) | (value & mask)