|
Вопрос по си |
|
|
|
Jul 22 2011, 16:12
|
Местный
  
Группа: Участник
Сообщений: 354
Регистрация: 21-11-10
Пользователь №: 61 046

|
Здравствуйте. Вопрос чисто по си. Знаю что писалось уже тысячу раз, но отыскать так и не получилось  есть некоторая переменная char temp нужно условие что старшая тетрада (старшие четыре бита) например равнялись 2 тоесть что-то типа Код if (temp ?? 0x20) {} как сделать? Подскажите пожалуйста. Что старшая тетрада равна 2 Спасибо!
|
|
|
|
|
 |
Ответов
|
Jul 27 2011, 16:21
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (777777 @ Jul 26 2011, 18:01)  А таким способом пользоваться не следует. Совершено нормальный способ. Надо смотреть, что эффективнее ложится на систему команд и оптимизируется. Для, например, старших тетрад 32битников подобный вариант предпочтительней. QUOTE Потому что если придется сравтивать не с 2, а например с 8, то результат будет неправвильным. Проблема ведь не в том, с чем сравнивать, а что сравнивать. Тут со знаком действительно проблема, но скорее всего, автору НУЖНО использовать вместо отданного на откуп компилятору типу char, unsigned тип. Кроме того, сейчас уже char по умолчанию обычно беззнаковый и компилятору можно указать использовать беззнаковый char. Ну или, если уж действительно вдруг нужна работа с signed char или с любым вариантом, то явные преобразования еще никто не отменял. (temp >> 4 ) == (char)0xF0 >> 4; будет работать всегда.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 6 2011, 17:57
|
Местный
  
Группа: Участник
Сообщений: 354
Регистрация: 21-11-10
Пользователь №: 61 046

|
Уважаемые форумчане, подскажите пожалуйста наиболее оптимальный вариант поиска последовательности нескольких байт. То есть есть последовательность байт, например ......0x05 0x51 0x12 0x64 0xC0 0x66 0x41.................................................. И вот мне нужно найти начало последовательности 0x64 0xC0 0x66 Как это сделать? Спасибо за внимание.
|
|
|
|
|
Aug 8 2011, 01:50
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Цитата(Павел_Б @ Aug 6 2011, 13:57)  Уважаемые форумчане, подскажите пожалуйста наиболее оптимальный вариант поиска последовательности нескольких байт. То есть есть последовательность байт, например ......0x05 0x51 0x12 0x64 0xC0 0x66 0x41.................................................. И вот мне нужно найти начало последовательности 0x64 0xC0 0x66 Как это сделать? Спасибо за внимание. Почему бы вам не почитать Кнута? Это все такие базовые вещи, что просто стыдно должно быть их спрашивать. Цитата(777777 @ Jul 26 2011, 12:01)  А таким способом пользоваться не следует. Потому что если придется сравтивать не с 2, а например с 8, то результат будет неправвильным. Для арма такой способ эффективнее, т.к. в нем сдвиг в любой инструкции к аргументу бесплатно можно применять.
|
|
|
|
|
Aug 9 2011, 14:51
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(Павел_Б @ Aug 9 2011, 18:07)  нужно его преображзовать в 2 символа char (y,z). где x будет иметь значение 3, а z=1 В Вашем трансляторе отсутствует функция sprintf? Правда, она очень прожорлива к ресурсам МК... Для Вашего случая и собственную функцию написать не сложно. Что-то типа такого: Код int x; char s[2]; s[0]= x/10 + '0'; s[1]= x%10 + '0'; Здесь отсутствует проверка на знак числа х. Кроме того, не подавляется первый ноль, в случае если число х<10, и выдаст неверный результат, если x>99... Доработайте сами под Ваши нужды.
|
|
|
|
|
Aug 9 2011, 15:07
|
Местный
  
Группа: Участник
Сообщений: 354
Регистрация: 21-11-10
Пользователь №: 61 046

|
Цитата(Палыч @ Aug 9 2011, 18:51)  В Вашем трансляторе отсутствует функция sprintf? Правда, она очень прожорлива к ресурсам МК... Для Вашего случая и собственную функцию написать не сложно. Что-то типа такого: Код int x; char s[2]; s[0]= x/10 + '0'; s[1]= x%10 + '0'; Здесь отсутствует проверка на знак числа х. Кроме того, не подавляется первый ноль, в случае если число х<10, и выдаст неверный результат, если x>99... Доработайте сами под Ваши нужды. Да, спасибо огромное. Тут ещё вопрос назрел. Как мне явно указать ячейку памяти в eeprom? Тоесть в программе будет меняться значение переменной в eeprom. После включения мк должен считать значение из этой ячейки. В связи с чем вопрос. Если я просто укажу ячейку как eeprom char j; И в программе она сменит значение. После нового включения я считаю значение переменной j из eeprom - она возъмёт из той же ячейки? И правильно ли будет такой алгоритм. Есть таже переменная в памяти eeprom. В обработчике прерываний таймера который работает на высокой скорости я пишу, например: if (j==0) {zz = 0;} else {zz = 1;} Просто насколько мне известно запись в eeprom занимает более 100 циклов тактового генератора. А вот чтение насколько быстро будет выполняться не знаю  Спасибо.
Сообщение отредактировал Павел_Б - Aug 9 2011, 15:15
|
|
|
|
Сообщений в этой теме
Павел_Б Вопрос по си Jul 22 2011, 16:12 Палыч if ( (temp & 0xF0) == 0x20) {} Jul 22 2011, 16:17 Павел_Б Спасибо большое!!! Jul 22 2011, 16:22  Genius1 Цитата(777777 @ Jul 26 2011, 19:01) А так... Jul 26 2011, 17:09   Палыч Цитата(Genius1 @ Jul 26 2011, 21:09) Из-з... Jul 26 2011, 19:20    Genius1 Цитата(Палыч @ Jul 26 2011, 22:20) Из-за ... Jul 27 2011, 15:09    Палыч Цитата(Павел_Б @ Aug 6 2011, 21:57) И вот... Aug 6 2011, 18:14     Павел_Б Цитата(Палыч @ Aug 6 2011, 21:14) Для так... Aug 6 2011, 18:19      Палыч Цитата(Павел_Б @ Aug 6 2011, 22:19) Слава... Aug 6 2011, 18:26       Павел_Б Цитата(Палыч @ Aug 6 2011, 21:26) Да, при... Aug 6 2011, 18:27      zltigo QUOTE (Павел_Б @ Aug 6 2011, 20:19) Слава... Aug 6 2011, 18:42       Павел_Б Цитата(zltigo @ Aug 6 2011, 21:42) А поду... Aug 6 2011, 18:53    777777 Цитата(Павел_Б @ Aug 6 2011, 21:57) Уважа... Aug 18 2011, 07:15 zltigo QUOTE (Павел_Б @ Jul 22 2011, 18:12) Вопр... Jul 22 2011, 16:27 Idle CODE$ cat el.c
#include <stdlib.h>
#in... Aug 6 2011, 20:57 Павел_Б Цитата(Idle @ Aug 6 2011, 23:57) CODE... Aug 7 2011, 02:56 zltigo QUOTE (Idle @ Aug 6 2011, 22:57)
Универс... Aug 7 2011, 09:11 Idle Цитата(Idle @ Aug 7 2011, 00:57)
пардону... Aug 20 2011, 19:40 ветерок Код DDRD = ~(1 << 2);
А вот эта ... Aug 7 2011, 05:28 MrYuran Цитата(ветерок @ Aug 7 2011, 09:28) А вот... Aug 10 2011, 04:47 Idle выставляет в единицу все биты кроме бита 2, 111110... Aug 7 2011, 06:58 ветерок Цитата(Idle @ Aug 7 2011, 10:58) выставля... Aug 7 2011, 09:31  Genius1 Цитата(ветерок @ Aug 7 2011, 12:31) А что... Aug 7 2011, 17:18 ветерок Genius1 спасибо
MrYuran ,да точно там такая стро... Aug 10 2011, 11:14 Палыч Цитата(ветерок @ Aug 10 2011, 15:14) (1 ... Aug 10 2011, 11:28 toweroff а как в С сделать именно "roll" битов?
п... Aug 10 2011, 16:22 MrYuran Цитата(toweroff @ Aug 10 2011, 20:22)
а... Aug 10 2011, 16:57  toweroff Цитата(MrYuran @ Aug 10 2011, 20:57) А ни... Aug 10 2011, 17:04  sergeeff Цитата(MrYuran @ Aug 10 2011, 20:57) А ни... Aug 10 2011, 17:39   toweroff Цитата(sergeeff @ Aug 10 2011, 21:39) Для... Aug 10 2011, 17:52   ARV Цитата(sergeeff @ Aug 10 2011, 20:39) Для... Aug 11 2011, 04:27 дымок Уважаемые коллеги, возможно ли использование указа... Aug 11 2011, 16:42 zltigo Для начала задумайтесь над тем, что Вы называете ... Aug 11 2011, 17:33 дымок Цитата(zltigo @ Aug 11 2011, 23:33) Для н... Aug 13 2011, 15:31  _Pasha Цитата(дымок @ Aug 13 2011, 18:31) Уважае... Aug 13 2011, 15:38   дымок Цитата(_Pasha @ Aug 13 2011, 21:38) ... Aug 13 2011, 16:56    aaarrr Цитата(дымок @ Aug 13 2011, 20:56) их был... Aug 13 2011, 20:11     дымок Цитата(aaarrr @ Aug 14 2011, 02:11) Кабы ... Aug 14 2011, 10:18      aaarrr Цитата(дымок @ Aug 14 2011, 14:18) Спасиб... Aug 14 2011, 12:25       дымок Цитата(aaarrr @ Aug 14 2011, 18:25) Не до... Aug 14 2011, 13:50   aaarrr Цитата(_Pasha @ Aug 13 2011, 19:38) ... Aug 14 2011, 14:19    дымок Цитата(aaarrr @ Aug 14 2011, 20:19) Расск... Aug 14 2011, 14:58  MrYuran Цитата(дымок @ Aug 13 2011, 19:31) Забыл ... Aug 18 2011, 07:27   дымок Цитата(MrYuran @ Aug 18 2011, 13:27) Кодt... Aug 18 2011, 15:42 Flexz Возможно, если архитектура поддерживает bit-bandin... Aug 11 2011, 19:36 aaarrr А volatile действительно нужен? (Сам факт использо... Aug 14 2011, 15:03 дымок Цитата(aaarrr @ Aug 14 2011, 21:03) А vol... Aug 14 2011, 15:09 aaarrr Так он, собственно, и вызывает ругань в 42-х места... Aug 14 2011, 15:17 дымок Цитата(aaarrr @ Aug 14 2011, 21:17) Так о... Aug 14 2011, 15:30 дымок Очень прошу дать ответ на следующий вопрос, почему... Aug 15 2011, 16:11 Палыч Из-за приоритета операций. В Вашем случае следует ... Aug 15 2011, 16:26  дымок Цитата(Палыч @ Aug 15 2011, 22:26) Из-за ... Aug 15 2011, 16:49 alexeyv ЦитатаНа эти битовые поля можно использовать указа... Aug 19 2011, 03:56 MrYuran Цитата(alexeyv @ Aug 19 2011, 07:56) Вся ... Aug 19 2011, 05:05 alexeyv ЦитатаПолучаем структуру байтовых флагов. Пожалуйс... Aug 19 2011, 10:25 sergeeff Нет указателя на бит в байте и нечего тут обсуждат... Aug 19 2011, 18:38
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|