задан байт 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 раза.
- Реклама
Re: помогите логическую функцию написать
На ассемблере это выглядело бы так:
Код: Выделить всё
bst flagi,1
bld flagi,0 - Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: помогите логическую функцию написать
Во всех 4-х примерах вы двигаете первый бит в нулевой
Тут не надо никакого условия.
Тут не надо никакого условия.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: помогите логическую функцию написать
просто мне после проверки условия нужно выполнить еще некоторые команды, а не только поменять нулевой бит.Gudd-Head писал(а):Во всех 4-х примерах вы двигаете первый бит в нулевой![]()
Тут не надо никакого условия.
У меня был код в котором переменные занимали байт, я хочу его оптимизировать, так как все переменные могут быть только 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: помогите логическую функцию написать
Можно сделать так:или использовать битовые поля. Но на деле за это стоит заморачиваться только при острой нехватке ОЗУ.
Код: Выделить всё
if ( ((flagi & 0x03) == 0x02) || ((flagi & 0x03) == 0x01) )
{
flag ^= 0x01;
}- Реклама

