Как присвоить бит
От: B0FEE664  
Дата: 08.03.13 17:30
Оценка:
Задача похожа на эту
Автор: 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
И каждый день — без права на ошибку...
Re: Как присвоить бит
От: watch-maker  
Дата: 08.03.13 17:38
Оценка: 14 (3)
(byte & ~mask) | mask_value
Re: Как присвоить бит
От: andyp  
Дата: 08.03.13 18:53
Оценка:
Здравствуйте, 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;
Re[2]: Как присвоить бит
От: andyp  
Дата: 08.03.13 19:04
Оценка:
ну и в твоих обозначениях:

A>x = (x | mask) — mask + mask_value;


Re: Как присвоить бит
От: collider  
Дата: 08.03.13 19:48
Оценка:
assert(0 != mask);
assert(0x01 == mask ||
0x02 == mask ||
0x04 == mask ||
0x08 == mask ||
0x10 == mask ||
0x20 == mask ||
0x40 == mask ||
0x80 == mask
);


думаю лучше будет
assert(0 != mask && 0x80%mask==0 );
Re[2]: Как присвоить бит
От: uzhas Ниоткуда  
Дата: 08.03.13 20:00
Оценка:
Здравствуйте, collider, Вы писали:

C>думаю лучше будет

C>assert(0 != mask && 0x80%mask==0 );

еще можно так
assert(mask && !(mask & (mask - 1)));

зы: не проверял
Re[2]: Как присвоить бит
От: rg45 СССР  
Дата: 09.03.13 11:04
Оценка:
Здравствуйте, watch-maker, Вы писали:

WM>
(byte & ~mask) | mask_value


Наиболее универсальное выражение, которым можно обрабатывать не только одиночные биты, но и группы битов, выглядит так:

(byte & ~mask) | (value & mask)
--
Не можешь достичь желаемого — пожелай достигнутого.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.