Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

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

 
Опции темы

C и как определить четное число

Непрочитано 07.08.2012, 21:44  
nonamedov
Почётный гражданин KAZUS.RUN
 
Регистрация: 06.06.2008
Сообщений: 1,519
Сказал спасибо: 76
Сказали Спасибо 427 раз(а) в 365 сообщении(ях)
nonamedov на пути к лучшему
По умолчанию Re: C и как определить четное число

Сообщение от Yurkin2007 Посмотреть сообщение
Так, что у топикстартера 1==1 заменялся на true, что есть просто 1, и потом спокойно делался битвайз "И" с Rendom. И всё работало как надо ...
Все варианты абсолютно эквивалентны, притом, вне зависимости от приоритета, а условие == можно(желательно) выкинуть.
Реклама:
nonamedov вне форума  
Непрочитано 08.08.2012, 04:17  
tempora
Почётный гражданин KAZUS.RUN
 
Регистрация: 10.01.2007
Сообщений: 3,411
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
tempora на пути к лучшему
По умолчанию Re: C и как определить четное число

Сообщение от Yurkin2007 Посмотреть сообщение
Щас спытал Борланд С++ на скорую руку. Оказывается, у него такие выражения мало того, что разрешены, они ещё имеют целое значение, ...
Что значит "оказывается"? Это соответствует правилам языка C.
Сообщение от Yurkin2007 Посмотреть сообщение
... true, что есть просто 1, ...
Ни в коем случае нельзя рассчитывать на то, что true означает 1 - это не соответствует правилам языка C. False - это ноль, а true - это "не ноль", и только.
__________________
There's always more than one way to skin a cat.
tempora вне форума  
Непрочитано 08.08.2012, 09:48  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: C и как определить четное число

Сообщение от tempora Посмотреть сообщение
Ни в коем случае нельзя рассчитывать на то, что true означает 1 - это не соответствует правилам языка C. False - это ноль, а true - это "не ноль", и только.
Вот про это я и намекал когда говорил что ==1 лишнее .
Да видно зря.
__________________
Осторожно , злой кот
dosikus вне форума  
Непрочитано 08.08.2012, 11:23  
dgo42
Прохожий
 
Регистрация: 10.01.2011
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
dgo42 на пути к лучшему
По умолчанию Re: C и как определить четное число

true (TRUE, True и т.д.) а также false... не определены в языке Си, равно как и в языке Си++.
При сравнении в Си "истина" это "не ноль" а ложь это "ноль" вне зависимости от количества бит переменной.
В Си нет "логического" типа данных (bool (C#), boolean (Java), Boolean, (Pascal) и т.д.)
Исходя из вопроса как определить четное (нечетное) число, т.е. число у которого младший бит равен "0" можно так:

if (!(random & 1)) {
// do something for even
}

нечетное соответственно:

if (random & 1) {
// do something for odd
}
dgo42 вне форума  
Непрочитано 08.08.2012, 11:32  
dgo42
Прохожий
 
Регистрация: 10.01.2011
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
dgo42 на пути к лучшему
По умолчанию Re: C и как определить четное число

Сообщение от dosikus Посмотреть сообщение
Вот про это я и намекал когда говорил что ==1 лишнее .
Да видно зря.
Уважаемый dosikus "== 1" не всегда лишнее. Например если надо проверить наличие сразу нескольких бит например наличие 0 и 3 бита то такая проверка не лишняя:

if ((PORTA & 0x9) == 0x9) {
// do something for bit 0 and 3
}

не одно и тоже с:

if (PORTA & 0x9) {
// do something for bit 0 or 3
}

потому что в первом случаи something будет выполнено если оба бита 0 и 3 установленны в "1", а во втором - если хотя бы один из битов 0 или 3 установлен в единицу.

Первый вариант соответствует "логическому и" для бит 0 и 3 а второй "логическое или".
dgo42 вне форума  
Непрочитано 08.08.2012, 11:45  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: C и как определить четное число

Сообщение от dgo42 Посмотреть сообщение
Уважаемый dosikus "== 1" не всегда лишнее. Например если надо проверить наличие сразу нескольких бит например наличие 0 и 3 бита то такая проверка не лишняя:
Блин вы тему то читаете ? Или просто отписаться?
Что ищет ТС ????
__________________
Осторожно , злой кот
dosikus вне форума  
Непрочитано 08.08.2012, 11:58  
lizard2010
Прохожий
 
Регистрация: 10.01.2011
Сообщений: 8
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 2 сообщении(ях)
lizard2010 на пути к лучшему
По умолчанию Re: C и как определить четное число

На больших процах еще можно так:

if( random % 2 )
ну или if(!( random % 2 )) в зависимости от того, по чёту или нечету надо действовать.

На маленьких - надо смотреть во что превращается код,
gcc точно это дело оптимизирует, а вот авр - может таки деление делать.
lizard2010 вне форума  
Непрочитано 08.08.2012, 12:14  
Yurkin2007
Заблокирован
 
Регистрация: 27.03.2007
Сообщений: 1,327
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
Yurkin2007 на пути к лучшему
По умолчанию Re: C и как определить четное число

Сообщение от tempora Посмотреть сообщение
true означает 1 - это не соответствует правилам языка C
Я, собственно, и имел это ввиду, когда обнаружил, что у Борланда
Код:
2 & true = 0
2 && true = true
PS. Кстати, у Майкрософт такая же петрушка ...

Последний раз редактировалось Yurkin2007; 08.08.2012 в 12:37.
Yurkin2007 вне форума  
Непрочитано 08.08.2012, 13:35  
tempora
Почётный гражданин KAZUS.RUN
 
Регистрация: 10.01.2007
Сообщений: 3,411
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
tempora на пути к лучшему
По умолчанию Re: C и как определить четное число

Сообщение от dgo42 Посмотреть сообщение
true ... а также false... не определены в языке Си,
Это Вы немного мимо - речь шла не о терминальных символах языка, а о результатах операций. Если же говорить именно о самом типе:
Сообщение от dgo42 Посмотреть сообщение
В Си нет "логического" типа данных
, то и это мимо - стандартом языка определен как тип _Bool (см. п.6.2.5 Types), так и значения true и false; кроме того, определено и макрорасширение bool - см. стандартный заголовочный файл stdbool.h.
Сообщение от dgo42 Посмотреть сообщение
... равно как и в языке Си++.
А вот это - много мимо, тип bool и его значения true и false в языке C++ есть изначально. Например, гляньте Бьёрна Страуструпа "Язык программирования C++", третье издание, п.4.1.1 "Фундаментальные типы" (он там первый в перечислении типов - не ошибётесь) и п.4.2 "Логические типы" - конкретно о bool, true и false.
Сообщение от dgo42 Посмотреть сообщение
При сравнении в Си "истина" это "не ноль" а ложь это "ноль" вне зависимости от количества бит переменной.
Не понял, при чём тут биты? Результат сравнения абстрагирован от типов операндов и одинаково определен на всех скалярных типах, в том числе на числах с плавающей точкой, и на указателях - какие там биты?

Я и себя поправлю - на самом деле, стандартом языка C определены именно значения 0 и 1 для ложного и истинного результатов операций сравнения, однако, раз напоровшись в каком-то компиляторе на '-1'-цу (0xFFFF), использовавшуюся для 'истины', я с тех пор избегаю таких жёстких привязок.
Сообщение от Yurkin2007 Посмотреть сообщение
2 & true = 0
Так это же не операция сравнения!
__________________
There's always more than one way to skin a cat.
tempora вне форума  
Непрочитано 08.08.2012, 14:09  
nonamedov
Почётный гражданин KAZUS.RUN
 
Регистрация: 06.06.2008
Сообщений: 1,519
Сказал спасибо: 76
Сказали Спасибо 427 раз(а) в 365 сообщении(ях)
nonamedov на пути к лучшему
По умолчанию Re: C и как определить четное число

Сообщение от tempora Посмотреть сообщение
Так это же не операция сравнения!
Ну, если уж на это пошло, то слева не lvalue переменная.
nonamedov вне форума  
 
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как 4 байта, принятых по USART превратить в число формата long int Black Jack Микроконтроллеры, АЦП, память и т.д 2 06.06.2012 21:32
Как в CVAVR вывести 3х-значное число на порты? code-by Микроконтроллеры, АЦП, память и т.д 26 23.03.2010 23:23
Как определить конденсатор? Dionisio Электроника - это просто 7 09.07.2008 19:32
Как определить Z состояние? DRFAUST Микроконтроллеры, АЦП, память и т.д 7 21.02.2008 00:32
Как определить мощность трансформатора malyshevsergey Источники питания и свет 9 16.05.2007 23:19


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


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