Страница 1 из 1

помогите логическую функцию написать

Добавлено: Чт янв 19, 2012 11:23:52
ESWANT
задан байт unsigned char flagi
нужно сделать ТАК:
если нулевой и первый бит разные то нулевому биту присваиваем значение первого бита
все остальные биты (2-7) должны остаться неизменными
использовать еще один байт для вычислений крайне нежелательно
как это сделать??

пример

flagi=0b xxxx xx01 результат 0b xxxx xx00
flagi=0b xxxx xx10 результат 0b xxxx xx11


flagi=0b xxxx xx00 результат 0b xxxx xx00
flagi=0b xxxx xx11 результат 0b xxxx xx11


вот что придумал я: (но это страшно!)

сдвигаю влево на 6 знаков и срвниваю...
и тогда подходящие варианты будут
либо 0b 0100 0000 (64) либо 0b 1000 000 (128)


if ( ( (flagi<<6)=128 ) | ((flagi<<6)=64) )

{
if (flagi & 0b00000010) flagi SET_BIT(0); else flagi CLR_BIT(0);
}


SET_BIT и CLR_BIT это макро устанавливающие или сбрасывающие нужный бит

Re: помогите логическую функцию написать

Добавлено: Чт янв 19, 2012 11:28:51
ploop
На ассемблере это выглядело бы так:

Код: Выделить всё

bst flagi,1
bld flagi,0 

Re: помогите логическую функцию написать

Добавлено: Чт янв 19, 2012 11:29:45
Gudd-Head
Во всех 4-х примерах вы двигаете первый бит в нулевой :wink:
Тут не надо никакого условия.

Re: помогите логическую функцию написать

Добавлено: Чт янв 19, 2012 11:49:11
ESWANT
Gudd-Head писал(а):Во всех 4-х примерах вы двигаете первый бит в нулевой :wink:
Тут не надо никакого условия.
просто мне после проверки условия нужно выполнить еще некоторые команды, а не только поменять нулевой бит.

У меня был код в котором переменные занимали байт, я хочу его оптимизировать, так как все переменные могут быть только 0 или один
тоесть было так:

Код: Выделить всё

unsigned char cur_param;
unsigned char Activ;

if (flagi & 0b00000100)  {
                             if (cur_param!=Activ)
                                          {
                                           cur_param = Activ;
                                           return 1;//внешняя реакция
                                           }
                             }//кн
else {
         .........
    }


a сейчас Activ и cur_param это биты №1 и №0 соответственно байта flagi[code]

Re: помогите логическую функцию написать

Добавлено: Чт янв 19, 2012 12:50:51
BerZerK-ku
Можно сделать так:

Код: Выделить всё

if ( ((flagi & 0x03) == 0x02) || ((flagi & 0x03) == 0x01) )
{
    flag ^= 0x01;
}
или использовать битовые поля. Но на деле за это стоит заморачиваться только при острой нехватке ОЗУ.