Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 11.02.2011, 12:15  
realid
Супер-модератор
 
Аватар для realid
 
Регистрация: 15.10.2007
Сообщений: 3,529
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
realid на пути к лучшему
По умолчанию Re: Работать с битами в переменной "С" помогите

Сообщение от 7Fantomas7 Посмотреть сообщение
Я смысл выражения не пойму.
Ну и как вы будете писать программы, если такого простого не понимаете?
Реклама:
realid вне форума  
Непрочитано 14.02.2011, 11:37  
igor1000
Заблокирован
 
Регистрация: 23.03.2008
Адрес: Ukraine
Сообщений: 1,306
Сказал спасибо: 1,749
Сказали Спасибо 1,878 раз(а) в 493 сообщении(ях)
igor1000 на пути к лучшему
По умолчанию Re: Работать с битами в переменной "С" помогите

Сообщение от ut1wpr Посмотреть сообщение
ну получили результат 00000001 в скобках и что? А где сравнение со значением 0 или 1. Т.е. само условие "если чтото равно чемуто" или "если чтото не равно чемуто" или "больше/меньше"
Это в паскале нужно обязательно сравнивать с чем-то, а в С -

само сравнение в операторе if (оператор if сравнивает с нулем).

Т.е. если в скобках получается все что угодно кроме нуля, то выражение считается истинным.

Офф. Вроде бы простой вопрос сам его понимаю, а как объяснил не знаю, понятно или нет (но большинство моментов требуют "внутреннего переваривания" - т.е.как в философии переход количества в качество).

Хотя никто не запрещает написать явно: if ((Var1 & Var2)==0), но в С так не принято (С-программисты начинают обзываться).

Последний раз редактировалось igor1000; 14.02.2011 в 11:45. Причина: Добавка
igor1000 вне форума  
Непрочитано 14.02.2011, 11:50  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Работать с битами в переменной "С" помогите

Без аргумента - булево сравнение.
omercury вне форума  
Непрочитано 14.02.2011, 12:06  
Bill
Гражданин KAZUS.RU
 
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
Bill на пути к лучшему
По умолчанию Re: Работать с битами в переменной "С" помогите

Сообщение от igor1000 Посмотреть сообщение
Хотя никто не запрещает написать явно: if ((Var1 & Var2)==0), но в С так не принято (С-программисты начинают обзываться).
Ерунда какая! Кому как нравится, тот так и пишет. Просто такая запись длиннее, чем
Код:
f (!(Var1 & Var2))
И вообще любое выражение имеет свое значение и может быть использовано в качестве условного. Например,
Код:
if (a = b)...
В данном случае в операторе if происходит присваивание значения одной переменной другой. При этом результатом такого выражения является значение переменной, которое является результатом условия.
Bill вне форума  
Непрочитано 14.02.2011, 12:58  
pozinm
Частый гость
 
Регистрация: 27.12.2010
Сообщений: 9
Сказал спасибо: 1
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
pozinm на пути к лучшему
По умолчанию Re: Работать с битами в переменной "С" помогите

Приветствую.

Сообщение от Bill Посмотреть сообщение
Ерунда какая! Кому как нравится, тот так и пишет. Просто такая запись длиннее, чем
Код:
f (!(Var1 & Var2))
А вот это не совсем так.
Наличие или отсутствие разницы в записи СИЛЬНО зависит от аппаратной платформы, конкретного компилятора и наличия/отсутствия оптимизации в нем. На разных процессорах/компиляторах эффективность по размеру или скорости выполнения генерируемого кода, из одного и того же исходника, сильно отличается. Приведу пример - на системах с развитой системой работы с адресацией (например Sparc) правильное использование указателей и адресной арифметики дает колоссальный прирост по производительности, который сильно нивелируется, например, на x86, и уходит в минус на Pic 8 bit. Или эффективность работы со стеком... Поэтому при работе на C в конкретных условиях приходится регулярно смотреть "а что тут у нас получается после компиляции?" и использовать более эффективные приемы.
Поэтому говорить, какая запись "более правильная" (конструкции, выполняющей одно и то же действие) можно только после анализа выхода используемого компилятора. Ну и при смене процессора/компилятора все заново....
Поэтому, чисто переносимый код, все таки несколько проигрывает оптимизированному под конкретный процессор/компилятор. Но оптимизированный код достаточно часто выигрывает у ассемблерного (как это ни смешно). Потому что у ассемблера система команд больше, и запомнить правила оптимизации зачастую сложнее Особенно, если в голове ассемблеры от многих процессоров (ну например - что выгоднее - сдвиг или умножение... и т.д.).

Так вот, несколько сумбурно...

С уважением,
Михаил
pozinm вне форума  
Непрочитано 14.02.2011, 13:42  
Bill
Гражданин KAZUS.RU
 
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
Bill на пути к лучшему
По умолчанию Re: Работать с битами в переменной "С" помогите

Хм... Во-первых, в приведенном примере речь идет только о эквивалентности конечного результата, хотя код может быть различным. Во-вторых, разница в коде может быть заметна, если совсем отключить оптимизацию. Самая элементарная оптимизация сведет разницу на нет. В-третьих, варианты одной и той же записи практически не зависят от конкретной платформы.
Пример:
Код:
extern char  x, y;
char test1(void)
	{
	if (!(x & y))
		return 0;
	return 1;
	}
char test2(void)
	{
	if ((x & y)==0)
		return 0;
	return 1;
	}
Результат при выключенной оптимизации
Код:
     1          extern char  x, y;

   \                                 In  segment CODE, align 2, keep-with-next
      2          char test1(void)
   \                     test1:
      3          	{
      4          	if (!(x & y))
   \   00000000   ....               LDI     R30, `x`
   \   00000002   8100               LD      R16, Z
   \   00000004   ....               LDI     R30, `y`
   \   00000006   8110               LD      R17, Z
   \   00000008   2301               AND     R16, R17
   \   0000000A   2300               TST     R16
   \   0000000C   F411               BRNE    ??test1_0
      5          		return 0;
   \   0000000E   E000               LDI     R16, 0
   \   00000010   9508               RET
      6          	return 1;
   \                     ??test1_0:
   \   00000012   E001               LDI     R16, 1
   \   00000014   9508               RET
      7          	}

   \                                 In  segment CODE, align 2, keep-with-next
      8          char test2(void)
   \                     test2:
      9          	{
     10          	if ((x & y)==0)
   \   00000000   ....               LDI     R30, `x`
   \   00000002   8100               LD      R16, Z
   \   00000004   ....               LDI     R30, `y`
   \   00000006   8110               LD      R17, Z
   \   00000008   2301               AND     R16, R17
   \   0000000A   2300               TST     R16
   \   0000000C   F411               BRNE    ??test2_0
     11          		return 0;
   \   0000000E   E000               LDI     R16, 0
   \   00000010   9508               RET
     12          	return 1;
   \                     ??test2_0:
   \   00000012   E001               LDI     R16, 1
   \   00000014   9508               RET
     13          	}

   Maximum stack usage in bytes:

     Function CSTACK RSTACK
     -------- ------ ------
     test1        0      2
     test2        0      2


   Segment part sizes:

     Function/Label Bytes
     -------------- -----
     test1            22
     test2            22
Найдите отличия.
Результат трансляции при полностью включенной оптимизации.
Код:
      1          extern char  x, y;

   \                                 In  segment CODE, align 2, keep-with-next
      2          char test1(void)
   \                     test1:
      3          	{
      4          	if (!(x & y))
   \   00000000   ....               LDI     R30, `x`
   \   00000002   8100               LD      R16, Z
   \   00000004   ....               LDI     R30, `y`
   \   00000006   8110               LD      R17, Z
   \   00000008   2301               AND     R16, R17
   \   0000000A   F411               BRNE    ??test1_0
      5          		return 0;
   \   0000000C   E000               LDI     R16, 0
   \   0000000E   9508               RET
      6          	return 1;
   \                     ??test1_0:
   \   00000010   E001               LDI     R16, 1
   \   00000012   9508               RET
      7          	}

   \                                 In  segment CODE, align 2, keep-with-next
      8          char test2(void)
   \                     test2:
      9          	{
     10          	if ((x & y)==0)
   \   00000000   ....               LDI     R30, `x`
   \   00000002   8100               LD      R16, Z
   \   00000004   ....               LDI     R30, `y`
   \   00000006   8110               LD      R17, Z
   \   00000008   2301               AND     R16, R17
   \   0000000A   F411               BRNE    ??test2_0
     11          		return 0;
   \   0000000C   E000               LDI     R16, 0
   \   0000000E   9508               RET
     12          	return 1;
   \                     ??test2_0:
   \   00000010   E001               LDI     R16, 1
   \   00000012   9508               RET
     13          	}

   Maximum stack usage in bytes:

     Function CSTACK RSTACK
     -------- ------ ------
     test1        0      2
     test2        0      2


   Segment part sizes:

     Function/Label Bytes
     -------------- -----
     test1            20
     test2            20
Попробуйте найти отличия.
Еще один вариант. Компилятор Cosmic, контроллер stm8. Также найдите отличия.
Код:
  18                     ; 2 char test1(void)
  18                     ; 3 	{
  19                     	scross	off
  20  0000               _test1:
  22                     ; 4 	if (!(x & y))
  23  0000 b600          	ld	a,_x
  24  0002 b500          	bcp	a,_y
  25  0004 2602          	jrne	L3
  26                     ; 5 		return 0;
  27  0006 4f            	clr	a
  29  0007 81            	ret	
  30  0008               L3:
  31                     ; 6 	return 1;
  32  0008 a601          	ld	a,#1
  34  000a 81            	ret	
  36                     ; 8 char test2(void)
  36                     ; 9 	{
  37  000b               _test2:
  39                     ; 10 	if ((x & y)==0)
  40  000b b600          	ld	a,_x
  41  000d b500          	bcp	a,_y
  42  000f 2602          	jrne	L5
  43                     ; 11 		return 0;
  44  0011 4f            	clr	a
  46  0012 81            	ret	
  47  0013               L5:
  48                     ; 12 	return 1;
  49  0013 a601          	ld	a,#1
  51  0015 81            	ret

Последний раз редактировалось Bill; 14.02.2011 в 13:57.
Bill вне форума  
Непрочитано 15.02.2011, 08:42  
microsmaster
Прохожий
 
Регистрация: 06.02.2010
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 2 сообщении(ях)
microsmaster на пути к лучшему
По умолчанию Re: Работать с битами в переменной "С" помогите

Как работать с битами на Си
microsmaster вне форума  
Эти 2 пользователя(ей) сказали Спасибо microsmaster за это сообщение:
igor1000 (15.02.2011), lag1828 (16.02.2011)
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проект на "С" не могу разобраться с переменной 7Fantomas7 Микроконтроллеры, АЦП, память и т.д 0 30.01.2011 15:56
Нужно пересчитать переменные на "С" помогите 7Fantomas7 Микроконтроллеры, АЦП, память и т.д 12 17.10.2010 13:37
Помогите с Фузи битами ATmega8L ewgen404 Микроконтроллеры, АЦП, память и т.д 2 03.03.2010 02:12


Часовой пояс GMT +4, время: 12:40.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot