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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
ESWANT
Встал на лапы
Сообщения: 98
Зарегистрирован: Пн дек 06, 2010 12:26:45

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

Сообщение 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 это макро устанавливающие или сбрасывающие нужный бит
Последний раз редактировалось ESWANT Чт янв 19, 2012 11:32:03, всего редактировалось 2 раза.
Реклама
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

На ассемблере это выглядело бы так:

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

bst flagi,1
bld flagi,0 
Реклама
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

Во всех 4-х примерах вы двигаете первый бит в нулевой :wink:
Тут не надо никакого условия.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
ESWANT
Встал на лапы
Сообщения: 98
Зарегистрирован: Пн дек 06, 2010 12:26:45

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

Сообщение 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]
Реклама
Эиком - электронные компоненты и радиодетали
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

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

Сообщение BerZerK-ku »

Можно сделать так:

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

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

Вернуться в «Микроконтроллеры и ПЛИС»