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

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

Группа: Участник
Сообщений: 39
Регистрация: 14-05-08
Пользователь №: 37 515

|
Цитата(777777 @ Jul 26 2011, 19:01)  А таким способом пользоваться не следует. Потому что если придется сравтивать не с 2, а например с 8, то результат будет неправвильным. Из-за того, что тип char?
|
|
|
|
|
Jul 27 2011, 15:09
|
Участник

Группа: Участник
Сообщений: 39
Регистрация: 14-05-08
Пользователь №: 37 515

|
Цитата(Палыч @ Jul 26 2011, 22:20)  Из-за того, что тип signed char (вспомните: что происходит со знаком при сдвиге вправо отрицательного числа). Ну я это и имел ввиду. Убедиться решил, что правильно думаю
|
|
|
|
|
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 6 2011, 18:19
|
Местный
  
Группа: Участник
Сообщений: 354
Регистрация: 21-11-10
Пользователь №: 61 046

|
Цитата(Палыч @ Aug 6 2011, 21:14)  Для такой короткой последовательности наиболее оптимально решение "в лоб": 1. Ищется значение 0x64 2 Проверяем, что следующий байт равен 0xC0, а за ним идёт 0x66. Если - нет, то на п.1 На словах я это представляю... Слава VMLAB-у, путём доООолгих ошибок и проб радилась такая весчь: temp=0; do {temp++;} while ((byte[temp] != 0x64) | (byte[(temp+1)] != 0xC0) | (byte[(temp+2)] != 0x66));
Сообщение отредактировал Павел_Б - Aug 6 2011, 18:20
|
|
|
|
|
Aug 6 2011, 18:27
|
Местный
  
Группа: Участник
Сообщений: 354
Регистрация: 21-11-10
Пользователь №: 61 046

|
Цитата(Палыч @ Aug 6 2011, 21:26)  Да, примерно - так. Осталось дополнить выходом из цикла при условии, что весь массив byte был просмотрен, но совпадений не обнаружено. Да, верно, это тоже нужно учесть! Спасибо!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|