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

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

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

|
Цитата(ветерок @ Aug 10 2011, 15:14)  (1 << 2) то есть такой сдвиг двигает единичку а после себя ноль оставляет ? Да, загляните уж в какой нибудь учебник по языку С! DDRD &= ~(1 << 2); 1. Десятичная константа 1. Двоичное представление 00000001 2. (1<<2) Сдвиг константы влево на 2. Получаем 00000100 3. ~(1<<2) Побитовая инверсия = 11111011 4. DDRD &= ~(1 << 2) Это эквивалентно такой записи DDRD = DDRD & ( ~(1 << 2)). Если значение битов DDRD равно (х7)(х6)(х5)(х4)(х3)(х2)(х1)(х0), то после побитового логического умножения на 11111011 получаем результат (х7)(х6)(х5)(х4)(х3)( 0)(х1)(х0), который и заносится в DDRD. Т.е. фактически - сбрасывается в ноль второй бит регистра DDRD.
|
|
|
|
|
Aug 10 2011, 17:39
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(MrYuran @ Aug 10 2011, 20:57)  А никак. Инлайнить асм только. И это в принципе правильно. Слишком уж аппаратнозависимо. Да бросьте вы только про asm inline. Для примера: Код __inline BYTE RotateByteLeft(BYTE n, unsigned long i) { return (n << i) | (n >> (8 - i)); }
__inline BYTE RotateByteRight(BYTE n, unsigned long i) { return (n >> i) | (n << (8 - i)); }
|
|
|
|
|
Aug 11 2011, 04:27
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Цитата(sergeeff @ Aug 10 2011, 20:39)  Для примера: Код __inline BYTE RotateByteLeft(BYTE n, unsigned long i) { return (n << i) | (n >> (8 - i)); }
__inline BYTE RotateByteRight(BYTE n, unsigned long i) { return (n >> i) | (n << (8 - i)); } или так: Код #define ROR(x,y) (((x) >> (y)) | ((x) << ((sizeof(x)*8 - (y)))
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Aug 13 2011, 15:31
|

Местный
  
Группа: Свой
Сообщений: 401
Регистрация: 7-05-10
Из: Оренбург
Пользователь №: 57 135

|
Цитата(zltigo @ Aug 11 2011, 23:33)  Для начала задумайтесь над тем, что Вы называете "битовой переменной". В зависимости от этого Вы сами сможете ответить на свой вопрос отрицательно, или положительно. Забыл сказать что я использую WinAVR. Жаль что Вы уклонились от ответа, в принципе я пробовал, не получилось. Потому мой ответ на мой вопрос отрицательный. void detect_akk(byte *flag_prm,byte *indakk_prm,word *cloc_prm); 1064: case 1: detect_akk(&akk1.ucon,&akk1.index,&akk1.cloc1);break; ../Mcuzuaa.c:1064: warning: passing argument 1 of 'detect_akk' discards qualifiers from pointer target type ../Mcuzuaa.c:1064: warning: passing argument 2 of 'detect_akk' discards qualifiers from pointer target type ../Mcuzuaa.c:1064: warning: passing argument 3 of 'detect_akk' discards qualifiers from pointer target type Уважаемые коллеги, если можно скажите в чём суть этих предупреждений, не могу понять. Хотя компиляция прошла успешно, всё же лучьше чтобы их небыло. Верхня строка прототип функции, следующая её вызов.
--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
|
|
|
|
|
Aug 13 2011, 15:38
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(дымок @ Aug 13 2011, 18:31)  Уважаемые коллеги, если можно скажите в чём суть этих предупреждений, не могу понять. Хотя компиляция прошла успешно, всё же лучьше чтобы их небыло. Верхня строка прототип функции, следующая её вызов. &akk1.ucon имеет тип void * Параметры же другого типа. Если указать в параметрах вызова функции (byte *)&akk1.ucon, матюк касательно первого параметра исчезнет, итд Это, межпрочим, не пустые вопли, они влияют на оптимизацию и на обращения к volatile переменным, если таковые в списке параметров.
Сообщение отредактировал _Pasha - Aug 13 2011, 15:38
|
|
|
|
|
Aug 13 2011, 16:56
|

Местный
  
Группа: Свой
Сообщений: 401
Регистрация: 7-05-10
Из: Оренбург
Пользователь №: 57 135

|
Цитата(_Pasha @ Aug 13 2011, 21:38)  &akk1.ucon имеет тип void * Параметры же другого типа. Если указать в параметрах вызова функции (byte *)&akk1.ucon, матюк касательно первого параметра исчезнет, итд Это, межпрочим, не пустые вопли, они влияют на оптимизацию и на обращения к volatile переменным, если таковые в списке параметров. Большое Вам спасибо, исправил и все предупреждения исчезли, а их было аж 42.
Сообщение отредактировал дымок - Aug 13 2011, 16:58
--------------------
Лень, оттвори дверь, сгоришь - а хоть и сгорю, но не оттворю.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|