Easyelectronics.ru

Электроника для всех
Текущее время: 20 сен 2020, 20:26

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 21 ] 
Автор Сообщение
 Заголовок сообщения: Изменение части байта 1 кнопкой
СообщениеДобавлено: 14 июл 2018, 20:03 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2014, 13:25
Сообщения: 980
Откуда: Earth
Есть байт данных, часть которого (младшую тетраду) необходимо менять нажатием кнопки по алгоритму цикличкого сдвига. В этой младшей тетраде может быть установлен только 1 бит. То есть было там 0100, нажали кнопку 1 раз - получили 0010, нажали еще раз - получили 0001, еще раз - 1000. Старшая тетрада должна оставтся неизменной. Как бы вы реализовали такое ? У меня в голове 2 варианта:
1. Копируем в переменную, зануляем старшую тетраду, двигаем байт в нужную сторону, проверяем младшую тетраду, если единицы нет, "создаем" ее в нужном углу тетрады. Копируем назад в наш байт данных, предварительно занулив старое значение тетрады. Куча действий.
2. Тупо проверяем каждый из 4 битов тетрады, и выставляем нужный (следующий) в 1, зануляя все остальные. Как-то подозрительно просто получается.
3. Ваше предложение.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Изменение части байта 1 кнопкой
СообщениеДобавлено: 14 июл 2018, 20:18 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 4332
Откуда: г. Липецк
Создаем таблицу из 4 байт со сдвигом, как вам нужно. Читаем по текущему состоянию. Конвертируем через таблицу. Результат пишем обратно. Никаких обнулений и проверки/установки бит.
P.S. Не, нужна таблица из 16 байт, т.к. адрес ниббл.


Последний раз редактировалось anakost 14 июл 2018, 20:52, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Изменение части байта 1 кнопкой
СообщениеДобавлено: 14 июл 2018, 20:26 
Старожил

Зарегистрирован: 05 фев 2013, 00:58
Сообщения: 3516
:)


Последний раз редактировалось iev91 20 май 2019, 00:43, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Изменение части байта 1 кнопкой
СообщениеДобавлено: 14 июл 2018, 20:31 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 4332
Откуда: г. Липецк
Вот за что не люблю С, за подобную белиберду. Может оно и правильно написано, но визуально непонятно...
Даже б если разнести это на 3-4 строчки с локальной переменной, результат был бы тот же (по коду), но гораздо понятней. И самому потом не придется через N времени вспоминать, что же я тут хотел.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Изменение части байта 1 кнопкой
СообщениеДобавлено: 14 июл 2018, 20:55 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2014, 13:25
Сообщения: 980
Откуда: Earth
Да, не совсем понятно, но если чуть расписать, то становится получше.
iev91, я правильно изменил Ваш пример для сдвига влево ?
Код:
state = (state & 0b11110000) + (state & 8 ? 1:0) + (state & 15<<1);

П.С. Сейчас как раз надо на Си. Если бы писал на асме, то скорее всего сделал бы через таблицу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Изменение части байта 1 кнопкой
СообщениеДобавлено: 14 июл 2018, 21:04 
Старожил

Зарегистрирован: 05 фев 2013, 00:58
Сообщения: 3516
:)


Последний раз редактировалось iev91 20 май 2019, 00:43, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Изменение части байта 1 кнопкой
СообщениеДобавлено: 14 июл 2018, 21:30 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 4332
Откуда: г. Липецк
iev91 писал(а):
...А мне и надо было непонятно ...

Вы можете испражнятся как угодно, это ваше право. Скажу только, что при работе в команде, тем более на производстве это не только не приветствуется, это волчий билет.


Последний раз редактировалось anakost 14 июл 2018, 21:32, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Изменение части байта 1 кнопкой
СообщениеДобавлено: 14 июл 2018, 21:32 
Старожил

Зарегистрирован: 05 фев 2013, 00:58
Сообщения: 3516
:)


Последний раз редактировалось iev91 20 май 2019, 00:42, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Изменение части байта 1 кнопкой
СообщениеДобавлено: 14 июл 2018, 21:35 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 4332
Откуда: г. Липецк
Да, понял, слишком серьезно отнесся, тем более мы с вами почти ровесники, улыбнулся.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Изменение части байта 1 кнопкой
СообщениеДобавлено: 16 июл 2018, 23:38 
Старожил

Зарегистрирован: 02 июл 2010, 23:41
Сообщения: 465
anakost писал(а):
Вот за что не люблю С, за подобную белиберду.

Белиберда она и есть белиберда.
Iev91 примером наглядно показал, что писать на СИ плохо.
Даже на древнем ассемблере будет простая и наглядная запись.
Наверно, первый вариант оптимальный. Практически все команды «одноассемблерные», выполняются быстро, читаются легко. Только я бы вместо проверки младшей тетрады на единицу проверял бы байт на «больше 8» и, при выполнении этого условия, менял тетрады местами.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Изменение части байта 1 кнопкой
СообщениеДобавлено: 16 июл 2018, 23:57 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 4332
Откуда: г. Липецк
Alexandr_1 писал(а):
...писать на СИ плохо...

Дело не в С, писАть на любом языке можно по разному. Я вам могу написАть то же самое и почти теми же мнемониками инструкций на Паскаль. Но речь же шла не об этом. При написании исходника использовать "магические числа" (непонятные на первый взгляд), это не комильфо. Тем более если нет комметариев. Тут же далее Gnusmas разложил более понятно, уже плюс. Но можно было разложить еще более понятней, применив локальную переменную и расписав в 3 строчки. Выходной ассемблерный код остался бы тем же, читаемость увеличилась бы в разы. ИМХО.
P.S. Мои слова это попытка обратного инжениринга ассемблерного кода на ЯВУ.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Изменение части байта 1 кнопкой
СообщениеДобавлено: 17 июл 2018, 02:28 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2867
Alexandr_1 писал(а):
Iev91 примером наглядно показал, что писать на СИ плохо.
Даже на древнем ассемблере будет простая и наглядная запись.

Просто вы видимо асм знаете лучше, чем C. Ничего сложного в записи выше нет. Кому сложно - расписывает её в 3 строчки и без десятичных чисел, как было изначально и получает тоже самое, но возможно более наглядно для себя.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Изменение части байта 1 кнопкойя
СообщениеДобавлено: 17 июл 2018, 14:25 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 856
Я бы написал так.
Код:
uint8_t high = state & 0xF0;
uint8_t low = (state & 0x0F) << 1;
state = high & (low >= 0x10 ? 1 : low);


Хотя, однострочник вероятно, предпочтительнее.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Изменение части байта 1 кнопкойя
СообщениеДобавлено: 17 июл 2018, 18:50 
Заглядывает иногда

Зарегистрирован: 26 фев 2018, 03:06
Сообщения: 126
Mirmik писал(а):
Я бы написал так.
Код:
state = high & (low >= 0x10 ? 1 : low);
что-то здесь не так или нет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Изменение части байта 1 кнопкой
СообщениеДобавлено: 17 июл 2018, 20:44 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6945
Не так - и в второй строке - сдвиг в другую сторону.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Изменение части байта 1 кнопкой
СообщениеДобавлено: 17 июл 2018, 21:41 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6945
register int a;
a=state & 0x0F;
state = (state ^ a) | (((a | (a<<4))>>1) & 0x0F);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Изменение части байта 1 кнопкой
СообщениеДобавлено: 18 июл 2018, 07:49 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 618
Откуда: Челябинск
Gnusmas писал(а):
Сейчас как раз надо на Си. Если бы писал на асме, то скорее всего сделал бы через таблицу.
А какая разница?
Код:
static char bitTable[] = {0x01, 0x02, 0x04, 0x08};
......
    state = (state & 0xF0) | bitTable[++i % 4];


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Изменение части байта 1 кнопкой
СообщениеДобавлено: 19 июл 2018, 12:50 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2014, 13:25
Сообщения: 980
Откуда: Earth
Для Вас никакой, а я в этой теме уже столько разных способов сделать одно и то же узнал))) На Си просто пока плохо соображаю. Как что непонятно - лезу в книжку, как не нахожу нужного в книжке - спрашиваю на форуме.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Изменение части байта 1 кнопкой
СообщениеДобавлено: 03 авг 2018, 07:52 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3684
Откуда: Новосибирск
Вариант 1:
Switch-case:

Код:
   if (Get_Event (EV_ID_KEY_PRESSED))
   {
      u08 a = (byte & 0x0F);

      switch (a)
      {
         case 1<<0: //     0b00000001
            a = (1<<1); // 0b00000010
            break;

         case 1<<1: //     0b00000010
            a = (1<<2); // 0b00000100
            break;

         case 1<<2: //     0b00000100
            a = (1<<3); // 0b00001000
            break;

         case 1<<3: //     0b00001000
            a = (1<<0); // 0b00000001
            break;
      }

      byte = ((byte & 0xF0) | a) ;
   }


Вариант 2:
таблица.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Изменение части байта 1 кнопкой
СообщениеДобавлено: 11 сен 2018, 13:32 
Старожил

Зарегистрирован: 04 окт 2012, 00:23
Сообщения: 2734
Откуда: Москва
Gnusmas писал(а):
1. Копируем в переменную,....

Не проще прибавить ряд 1,2,4. Нет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Изменение части байта 1 кнопкой
СообщениеДобавлено: 11 сен 2018, 14:06 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 705
По участвую :)
Код:
int main () {
   union {
      struct {
         unsigned l:4;
         unsigned h:4;
      };
      unsigned char b;
   } byte1;

   byte1.b = 0xe1;
    // scroll left;
   byte1.l = (byte1.l & 8)? 1 : byte1.l << 1;
   printf("%hhx\n",byte1.b);
   // scroll right
   byte1.l = (byte1.l & 1)? 8 : byte1.l >> 1;
   printf("%hhx\n",byte1.b);
   return(0);
}

как то так ! ;)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 21 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB