реклама на сайте
подробности

 
 
5 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Вопрос по си
Павел_Б
сообщение Jul 22 2011, 16:12
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 354
Регистрация: 21-11-10
Пользователь №: 61 046



Здравствуйте.
Вопрос чисто по си.
Знаю что писалось уже тысячу раз, но отыскать так и не получилось sad.gif
есть некоторая переменная char temp
нужно условие что старшая тетрада (старшие четыре бита) например равнялись 2
тоесть что-то типа
Код
if (temp ?? 0x20) {}

как сделать?
Подскажите пожалуйста.
Что старшая тетрада равна 2
Спасибо!
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jul 22 2011, 16:17
Сообщение #2


Гуру
******

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



if ( (temp & 0xF0) == 0x20) {}
Go to the top of the page
 
+Quote Post
Hellper
сообщение Jul 22 2011, 16:19
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 13-08-07
Из: Санкт-Петербург
Пользователь №: 29 745



(temp >> 4 ) == 2


--------------------
Go to the top of the page
 
+Quote Post
Павел_Б
сообщение Jul 22 2011, 16:22
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 354
Регистрация: 21-11-10
Пользователь №: 61 046



Спасибо большое!!! rolleyes.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 22 2011, 16:27
Сообщение #5


Гуру
******

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



QUOTE (Павел_Б @ Jul 22 2011, 18:12) *
Вопрос чисто по си.

Для чисто по 'C' есть буквари и на крайний случай раздел программирования для начинающих.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
777777
сообщение Jul 26 2011, 16:01
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(Hellper @ Jul 22 2011, 20:19) *
(temp >> 4 ) == 2

А таким способом пользоваться не следует. Потому что если придется сравтивать не с 2, а например с 8, то результат будет неправвильным.
Go to the top of the page
 
+Quote Post
Genius1
сообщение Jul 26 2011, 17:09
Сообщение #7


Участник
*

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



Цитата(777777 @ Jul 26 2011, 19:01) *
А таким способом пользоваться не следует. Потому что если придется сравтивать не с 2, а например с 8, то результат будет неправвильным.

Из-за того, что тип char?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jul 26 2011, 19:20
Сообщение #8


Гуру
******

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



Цитата(Genius1 @ Jul 26 2011, 21:09) *
Из-за того, что тип char?
Из-за того, что тип signed char (вспомните: что происходит со знаком при сдвиге вправо отрицательного числа).
Go to the top of the page
 
+Quote Post
Genius1
сообщение Jul 27 2011, 15:09
Сообщение #9


Участник
*

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



Цитата(Палыч @ Jul 26 2011, 22:20) *
Из-за того, что тип signed char (вспомните: что происходит со знаком при сдвиге вправо отрицательного числа).

Ну я это и имел ввиду. Убедиться решил, что правильно думаю sm.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 27 2011, 16:21
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Павел_Б
сообщение Aug 6 2011, 17:57
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 354
Регистрация: 21-11-10
Пользователь №: 61 046



Уважаемые форумчане, подскажите пожалуйста наиболее оптимальный вариант поиска последовательности нескольких байт.
То есть есть последовательность байт, например
......0x05 0x51 0x12 0x64 0xC0 0x66 0x41..................................................

И вот мне нужно найти начало последовательности 0x64 0xC0 0x66
Как это сделать? smile3046.gif
Спасибо за внимание.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Aug 6 2011, 18:14
Сообщение #12


Гуру
******

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



Цитата(Павел_Б @ Aug 6 2011, 21:57) *
И вот мне нужно найти начало последовательности 0x64 0xC0 0x66
Как это сделать?
Для такой короткой последовательности наиболее оптимально решение "в лоб":
1. Ищется значение 0x64
2 Проверяем, что следующий байт равен 0xC0, а за ним идёт 0x66. Если - нет, то на п.1

Go to the top of the page
 
+Quote Post
Павел_Б
сообщение Aug 6 2011, 18:19
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Палыч
сообщение Aug 6 2011, 18:26
Сообщение #14


Гуру
******

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



Цитата(Павел_Б @ Aug 6 2011, 22:19) *
Слава VMLAB-у, путём доООолгих ошибок и проб радилась такая весчь
Да, примерно - так. Осталось дополнить выходом из цикла при условии, что весь массив byte был просмотрен, но совпадений не обнаружено.
Go to the top of the page
 
+Quote Post
Павел_Б
сообщение Aug 6 2011, 18:27
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 354
Регистрация: 21-11-10
Пользователь №: 61 046



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

Да, верно, это тоже нужно учесть!
Спасибо! sm.gif
Go to the top of the page
 
+Quote Post

5 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 18:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01472 секунд с 7
ELECTRONIX ©2004-2016