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

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

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

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

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

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

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

 
Опции темы

Работать с битами в переменной "С" помогите

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

Сообщение от 7Fantomas7 Посмотреть сообщение
Я смысл выражения не пойму.
Ну и как вы будете писать программы, если такого простого не понимаете?
Реклама:
realid вне форума  
Непрочитано 14.02.2011, 11:37  
igor1000
Заблокирован
 
Регистрация: 23.03.2008
Адрес: Ukraine
Сообщений: 1,298
Сказал спасибо: 1,744
Сказали Спасибо 1,879 раз(а) в 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.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Работать с битами в переменной "С" помогите

Без аргумента - булево сравнение.
omercury вне форума  
Непрочитано 14.02.2011, 12:06  
Bill
Гражданин KAZUS.RUN
 
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 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.RUN
 
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 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, время: 03:45.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.