Павел_Б 0 22 июля, 2011 Опубликовано 22 июля, 2011 · Жалоба Здравствуйте. Вопрос чисто по си. Знаю что писалось уже тысячу раз, но отыскать так и не получилось :( есть некоторая переменная char temp нужно условие что старшая тетрада (старшие четыре бита) например равнялись 2 тоесть что-то типа if (temp ?? 0x20) {} как сделать? Подскажите пожалуйста. Что старшая тетрада равна 2 Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 22 июля, 2011 Опубликовано 22 июля, 2011 · Жалоба if ( (temp & 0xF0) == 0x20) {} Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Hellper 0 22 июля, 2011 Опубликовано 22 июля, 2011 · Жалоба (temp >> 4 ) == 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Павел_Б 0 22 июля, 2011 Опубликовано 22 июля, 2011 · Жалоба Спасибо большое!!! :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 22 июля, 2011 Опубликовано 22 июля, 2011 · Жалоба Вопрос чисто по си. Для чисто по 'C' есть буквари и на крайний случай раздел программирования для начинающих. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 26 июля, 2011 Опубликовано 26 июля, 2011 · Жалоба (temp >> 4 ) == 2 А таким способом пользоваться не следует. Потому что если придется сравтивать не с 2, а например с 8, то результат будет неправвильным. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Genius1 0 26 июля, 2011 Опубликовано 26 июля, 2011 · Жалоба А таким способом пользоваться не следует. Потому что если придется сравтивать не с 2, а например с 8, то результат будет неправвильным. Из-за того, что тип char? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 26 июля, 2011 Опубликовано 26 июля, 2011 · Жалоба Из-за того, что тип char?Из-за того, что тип signed char (вспомните: что происходит со знаком при сдвиге вправо отрицательного числа). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Genius1 0 27 июля, 2011 Опубликовано 27 июля, 2011 · Жалоба Из-за того, что тип signed char (вспомните: что происходит со знаком при сдвиге вправо отрицательного числа). Ну я это и имел ввиду. Убедиться решил, что правильно думаю :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 27 июля, 2011 Опубликовано 27 июля, 2011 · Жалоба А таким способом пользоваться не следует. Совершено нормальный способ. Надо смотреть, что эффективнее ложится на систему команд и оптимизируется. Для, например, старших тетрад 32битников подобный вариант предпочтительней. Потому что если придется сравтивать не с 2, а например с 8, то результат будет неправвильным. Проблема ведь не в том, с чем сравнивать, а что сравнивать. Тут со знаком действительно проблема, но скорее всего, автору НУЖНО использовать вместо отданного на откуп компилятору типу char, unsigned тип. Кроме того, сейчас уже char по умолчанию обычно беззнаковый и компилятору можно указать использовать беззнаковый char. Ну или, если уж действительно вдруг нужна работа с signed char или с любым вариантом, то явные преобразования еще никто не отменял. (temp >> 4 ) == (char)0xF0 >> 4; будет работать всегда. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Павел_Б 0 6 августа, 2011 Опубликовано 6 августа, 2011 · Жалоба Уважаемые форумчане, подскажите пожалуйста наиболее оптимальный вариант поиска последовательности нескольких байт. То есть есть последовательность байт, например ......0x05 0x51 0x12 0x64 0xC0 0x66 0x41.................................................. И вот мне нужно найти начало последовательности 0x64 0xC0 0x66 Как это сделать? :smile3046: Спасибо за внимание. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 6 августа, 2011 Опубликовано 6 августа, 2011 · Жалоба И вот мне нужно найти начало последовательности 0x64 0xC0 0x66 Как это сделать? Для такой короткой последовательности наиболее оптимально решение "в лоб": 1. Ищется значение 0x64 2 Проверяем, что следующий байт равен 0xC0, а за ним идёт 0x66. Если - нет, то на п.1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Павел_Б 0 6 августа, 2011 Опубликовано 6 августа, 2011 (изменено) · Жалоба Для такой короткой последовательности наиболее оптимально решение "в лоб": 1. Ищется значение 0x64 2 Проверяем, что следующий байт равен 0xC0, а за ним идёт 0x66. Если - нет, то на п.1 На словах я это представляю... Слава VMLAB-у, путём доООолгих ошибок и проб радилась такая весчь: temp=0; do {temp++;} while ((byte[temp] != 0x64) | (byte[(temp+1)] != 0xC0) | (byte[(temp+2)] != 0x66)); Изменено 6 августа, 2011 пользователем Павел_Б Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 6 августа, 2011 Опубликовано 6 августа, 2011 · Жалоба Слава VMLAB-у, путём доООолгих ошибок и проб радилась такая весчьДа, примерно - так. Осталось дополнить выходом из цикла при условии, что весь массив byte был просмотрен, но совпадений не обнаружено. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Павел_Б 0 6 августа, 2011 Опубликовано 6 августа, 2011 · Жалоба Да, примерно - так. Осталось дополнить выходом из цикла при условии, что весь массив byte был просмотрен, но совпадений не обнаружено. Да, верно, это тоже нужно учесть! Спасибо! :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться