Проверка четности?

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

вот я немного задумался, а что лучше (правильнее) использовать для проверки четности?

проверять остаток от деления или младший бит?

а % 2
 или 
а & 1

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Мляяя. Вбей себе в мосх - 1 в младшем бите, - число НЕЧЕТНОЕ, это 2 в 0 степени. 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну четность в программировании и в математики явления разные. Так в программировании если количество единиц в числе четное , то и число четное.

Задачка, которую хороший программист решит за пару минут, а хороший
физик сойдет с ума: Ася весит 4,2 метра. За сколько времени она
скачается, если ширина канала — 5 кило в секунду?

 

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

проверка четноСТИ и проверка четноГО - немного не одно и тоже....

5 % 2 = 1

5 & 1 = 1

вопрос звучал "что правильнее" а не "как найти четное"

 

если так сильно глаза это режет, то переиначу

!( а%2 )
или
!( а&1 )

 

Green
Offline
Зарегистрирован: 01.10.2015

Проверка на чётность. Найдено в алгоритмах.

bool parity(uint8_t v)
{
  v ^= v>>4;
  return 6>>((v ^ v>>2) & 3) & 1;
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

На как правильнее зарабатывать деньги. Будет естестенно ответ что их надо зарабатывать и не важно на какой работе. Вот так и счетностью. Смотреть надо на результат а не процесс.

b707
Онлайн
Зарегистрирован: 26.05.2017

ELITE пишет:

вопрос звучал "что правильнее" а не "как найти четное"

Если два метода дают одинаково правильный ответ, то вопрос - какой из них "правильнее" - смысла не имеет.

Сравнивайте по другому критерию. Может вас интересует какой быстрее? или меньше места в коде занимает?

VladimirTsibrov
Offline
Зарегистрирован: 05.03.2019

В целом, конечно, логическая операция выполнится быстрее, чем деление, которого нет в AVR. Но в вашем случае не принципиально, потому что компилятор сгенерирует код, проверяющий младший бит числа.

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

спасибо, это и требовалось услышать

b707
Онлайн
Зарегистрирован: 26.05.2017

ELITE пишет:

спасибо, это и требовалось услышать

интересно. сколько слов из ответа вы поняли? :)

sadman41
Offline
Зарегистрирован: 19.10.2016

...и что надо было в итоге - parity или делимость на 2?

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

sadman41 пишет:

...и что надо было в итоге - parity или делимость на 2?

в итоге надо было мигающее ":" на экране часов между часами и минутами

b707
Онлайн
Зарегистрирован: 26.05.2017

ELITE пишет:

в итоге надо было мигающее ":" на экране часов между часами и минутами

это ЛОЛ

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

sadman41
Offline
Зарегистрирован: 19.10.2016

Для мигающего достаточно было state = !state

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

если есть секунды - зачем отводить еще одну переменную для ключа?

пусть мигает через секунду, меня это вполне устраивает

sadman41
Offline
Зарегистрирован: 19.10.2016

Это вопрос философский. Мне даже мигающего не нужно, к примеру. Ну, а если зрить в корень, то на загруженной системе может вполне себе "выпасть" две и более четные секунды. Это как "зеленую улицу" поймать.

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

sadman41 пишет:

Это вопрос философский. Мне даже мигающего не нужно, к примеру. Ну, а если зрить в корень, то на загруженной системе может вполне себе "выпасть" две и более четные секунды. Это как "зеленую улицу" поймать.

не, я на 328 делаю - там ресурсов много, это не тини13, экономить нечего....

 

а мигание - как индикатор, что оно работает.... т.к. прочие показатели весьма статичны

sadman41
Offline
Зарегистрирован: 19.10.2016

Экономить нечего, а одного байта на качельку жалко ))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ELITE пишет:

в итоге надо было мигающее ":" на экране часов между часами и минутами

иоптваюмать. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ELITE пишет:

вот я немного задумался, а что лучше (правильнее) использовать для проверки четности?

проверять остаток от деления или младший бит?

а % 2
 или 
а & 1

А как это делается на 20-ти языках, которые Вы знаете "на уровне выше ..."?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

В каждом- по-разному, видима. 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Мужики, а давайте не будем рассказывать ему про выход SQW у DS3231? А то вгоним в когнитивный диссонанс человека, когда он узнает, что и проверять-то ничего не надо - достаточно по факту прерывания моргать двоеточием и перерисовывать изменившиеся части.

Пожалеем профессора? А то тяжкая эта ноша - 20 языков на уровне выше университетского...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я в часах всегда мигаю на 1 герц, т.е. инвертирую раз в полсекунды. По-моему, гораздо симпатичнее получается.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

DIYMan пишет:

Мужики, а давайте не будем рассказывать ему про выход SQW у DS3231? А то вгоним в когнитивный диссонанс человека, когда он узнает, что и проверять-то ничего не надо - достаточно по факту прерывания .

Вот только кошерно в обработчике прерываний менять флаг. А моргать двоеточием и перерисовывать изменившиеся части все же в основном цикле. Но тогда чем это от millis отличается.

Цитата:

Пожалеем профессора? А то тяжкая эта ноша - 20 языков на уровне выше университетского...

Ну да. Вот я владею одним русским на уровне носителя языка и то тяжковато получается, а тут 20.

sadman41
Offline
Зарегистрирован: 19.10.2016

Квон, сам подумай - один байт сравнивать с единицей или вычислить разницу между двумя четырехбайтовыми и потом еще сравнить с четырёхбайтовым? И еще всякие сопутствующие...

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

sadman41 пишет:

Квон, сам подумай - один байт сравнивать с единицей или вычислить разницу между двумя четырехбайтовыми и потом еще сравнить с четырёхбайтовым? И еще всякие сопутствующие...

А аппаратные затраты. пин и провода.   Если есть возможность экономить железо за счет софта то это делать желательно. Чем меньше контактов тем меньше маловычисляемых багов.

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, кто как собирает =))

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

qwone пишет:

А аппаратные затраты. пин и провода.   Если есть возможность экономить железо за счет софта то это делать желательно. Чем меньше контактов тем меньше маловычисляемых багов.

Пух прав ! Как никогда !

Green
Offline
Зарегистрирован: 01.10.2015

brokly пишет:

Пух прав ! Как никогда !


А тут ещё такая фишка бывает. При батарейном питании, случается так что Ардуино ещё работает, а DS3231 уже отключился, ну и SQW есстественно ушло. А тогда уже выручает millis. Хотя, это уже извращение.)

vlad072
Offline
Зарегистрирован: 01.08.2017

Всегда использовал остаток деления, и как то не задумывался что можно по другому. А действительно, "& 1" здесь как то уместней, или кошерней что ли ))

зы. Прикольно, простой вроде вопрос, а срача мегамозги наспамили целый воз...

countervectorbase
Offline
Зарегистрирован: 04.10.2020

Спасибо, помогли: допустим есть число N0 и оно равно 22, т.е. - четное. 

int N0=22

и, если сделать: 

if((N0 % 2 )== true){ //если нечетное, то Инструкция_1}
else{ //если четное, то Инструкция_2}

Все хорошо. Исправил.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

на чётность абычна проверяют так:

if ( N0 & 0x01 )  // нечетное число
else // четное число

у тебя неправильно

 

nik182
Offline
Зарегистрирован: 04.05.2015

Проверять на чётность можно по разному. Вот ==true это лишнее.%2 достаточно - будет 0 - false для любого чётного, 1 - true для любого нечётного. Только вот сердце вещует, что компилятор для обоих записей даст одинаковый код.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

не скажи, как у Деда это просто бит единички посмотреть )))

nik182
Offline
Зарегистрирован: 04.05.2015

Что не сказать? Остаток от 2 тоже только первый разряд посмотреть.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

nik182 пишет:
Что не сказать? Остаток от 2 тоже только первый разряд посмотреть.

от деления, это сдвиговые операции, и смотреться там будет флаг переноса
PS я тут как-то с Дракулой полемику развел насчет цикла for где счетчик сделан взад, а потом подумал подумал и пришёл к выводу, что программисты писавшие эту функцию компилятора большие головы, по сути сделали универсальную функцию и тут два затрагиваемых флага - благо...

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

DetSimen пишет:

на чётность абычна проверяют так:

if ( N0 & 0x01 )  // нечетное число
else // четное число

у тебя неправильно

Мне почему то кажется, что обе записи в результате , после компиляции, дадут одинаковый код.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

brokly пишет:

Мне почему то кажется, что обе записи в результате , после компиляции, дадут одинаковый код.

А Вы повнимательнее на #31 посмотрите. Комментарии почитайте. Там же всё наоборот перепутано.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Действительно :)

countervectorbase
Offline
Зарегистрирован: 04.10.2020
int N0=24; //Зададим наше проверяемое число
void setup(){
Serial.begin(9600);
}
void loop() {
if((N0 % 2 )== true){ Serial.println("нечетное");}
else{ Serial.println("четное");}
}

Исправил, ребят.

v258
Offline
Зарегистрирован: 25.05.2020

countervectorbase пишет:

int N0=24; //Зададим наше проверяемое число
void setup(){
Serial.begin(9600);
}
void loop() {
if(N0 % 2 ){ Serial.println("нечетное");}
else{ Serial.println("четное");}
}

== true в 6 строке - лишнее

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

v258 пишет:

countervectorbase пишет:

int N0=24; //Зададим наше проверяемое число
void setup(){
Serial.begin(9600);
}
void loop() {
if(N0 % 2 ){ Serial.println("нечетное");}
else{ Serial.println("четное");}
}

== true в 6 строке - лишнее

оно то да, но Дед так не считает, вроде как...если я ничё не путаю )))

v258
Offline
Зарегистрирован: 25.05.2020

ua6em пишет:

оно то да, но Дед так не считает, вроде как...если я ничё не путаю )))

Не надо на Деда поклеп возводить, см. #32 ))

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

v258 пишет:

ua6em пишет:

оно то да, но Дед так не считает, вроде как...если я ничё не путаю )))

Не надо на Деда поклеп возводить, см. #32 ))

буду думать, что "всё как говорили, токо немножко перепутали", появится может попинать меня чуток )))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ua6em пишет:

оно то да, но Дед так не считает, вроде как...если я ничё не путаю )))

не путай. Если выражение отдаёт bool, тогда == true лишнее

if (isReady()) ...  // здесь  == true лишнее

Если выражение имеет тип int, тогда я стараюсь писать

if ((N & 0x01) == 0x01) ...

в #32 я просто написал по Сишному, чтобы не загромождать. Код одинаковый, только так мне нагляднее, что именно я проверяю

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

теперь надеюсь не забуду, то-есть

if((N0 % 2)==1 ){ Serial.println("нечетное");}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

теперь надеюсь не забуду, то-есть

if((N0 % 2)==1 ){ Serial.println("нечетное");}

Плохая идея! 

Гораздо аккуратнее сравнивать на "!= 0", чем на "== 1". Такое сравнение подведёт Вас в случае отрицательного N0, т.к. там остаток будет "-1" и Вы посчитаете число чётным.

Запустите и убедитесь сами

#include <Printing.h>

void setup(void) {
	Serial.begin(57600);
	const int N = 13;
	const int M = -13;
	printVar(N % 2);
	printVar(M % 2);
}

void loop(void) {}
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

мда. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:

мда. 

Что, я лопухнулся в чём-то? 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em,

можете ответить "любезностью на любезность" и подcказать мне по схемотехнике? Вопрос-то уровня песочницы, но поставил меня в тупик :-(

Вот смотрите, когда девайс питается постоянкой и у меня есть запас по напряжению, я всегда ставлю на входе питания диодный мост, чтобы не зависеть от того где у БП плюс, а где минус (а то у розеточных БП на центральном проводе бывает хоть то, хоть другое) :-(

А как быть в случае переменки, если мне не всё равно где ноль, а где фаза? Существует ли подобное по простоте решение вывести фазу именно туда, куда мне надо? Если существует, можете показать?