Четность числа

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Четность числа

Сообщение Yurich » 09.08.2003 (Сб) 7:20

Напомните, как определить. Если можно, желательно без делений и умножений.

Kostyan
Постоялец
Постоялец
 
Сообщения: 439
Зарегистрирован: 20.09.2002 (Пт) 4:14
Откуда: Россия, Уссурийск

Сообщение Kostyan » 09.08.2003 (Сб) 8:08

Если (число mod 2 = 0) то чило четно, иначе нечетно
:roll: (почти без делений)

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 09.08.2003 (Сб) 11:26

Немного причешу...

Если ((число mod 2) = 0) то
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 09.08.2003 (Сб) 15:18

Э-э-э, Mod - все ж таки деление.

Может лучше:
если (число And 1)=0 то

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 09.08.2003 (Сб) 17:05

-> то енто тоже деление.
Dmitrich

kipelov
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 09.08.2003 (Сб) 19:00
Откуда: Донецк

Сообщение kipelov » 09.08.2003 (Сб) 19:04

:D
а что, разве ни хто не знает, как определять чет/нечет с помощью верхнего и нижнего байта числа.

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 09.08.2003 (Сб) 23:25

Educate us stupid-headed, please :D :D :D
Dmitrich

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 10.08.2003 (Вс) 1:11

если (число And 1)=0 то -> то енто тоже деление.

а по моим замерам (число And 1) на 30% быстрее, чем (число mod 2)

а что, разве ни хто не знает, как определять чет/нечет с помощью верхнего и нижнего байта числа.

Oсьмнадцать лет с Басиком, но о таком не слыхивал, просветите, плиз!

Tauron
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 187
Зарегистрирован: 14.07.2002 (Вс) 17:43
Откуда: Kazakhstan

Сообщение Tauron » 10.08.2003 (Вс) 8:05

2Kipelov:
Ты нигде не ошибся: для integer это вообще не имеет смысла, в нем всего 2 байта.
Dmitry2003:
С каких это пор And стал делением? Это вроде как логическое умножение. Которое кстати и дает последний бит числа. (В данном случае)
Трезвая голова, холодный ум и ледяное сердце.

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 10.08.2003 (Вс) 21:12

Реальная тема да ааа????у теоретики.
-----------------------------------
Господин(жа) Yurich писал(ла)

Тема: Четность числа.
Вопрос: Напомните, как определить. Если можно, желательно
без делений и умножений.


Ответы:
------------
Kostyan -> Если (число mod 2 = 0) то чило четно, иначе нечетно.
Sebas -> Если ((число mod 2) = 0) то

Dmitriy2003 -> то енто тоже деление (гм..)

Я думал на етом усе закончится. Нифига...Далее еще интереснее.

kipelov -> а что, разве ни хто не знает, как определять чет/нечет
c помощью верхнего и нижнего байта числа.

Yurich -> а по моим замерам (число And 1) на 30% быстрее,
чем (число mod 2).

Tauron -> С каких это пор And стал делением? Это вроде как логическое
умножение. Которое кстати и дает последний бит числа.
(В данном случае)

Выводы:
-------------
Как видно из выше пересказаного сплошной флуд. Какждый следующий ответ не
только не отвечает на вопрос, но и уводит на дорогу мерзких
двухсмысленностей.

Тест:
-------------
Поскольку в данных дебетах неудалось найте решение по определению
чет/нечет числа без делений или умножений выясним же наконец ->

Who is Faster 'Mod' or 'And' ???

Вот плоды моего безделья ->
Для измерения использую :

1000 елементов массива
QueryPerformanceCounter
QueryPerformanceFrequency

----------------------
ID-Mod-And
----------------------
1)-0.0767- 0.0805
2)-0.0753- 0.0788
3)-0.0769- 0.0784
4)-0.0756- 0.078
5)-0.0777- 0.0774
----------------------
Алгоритм выбирает четные числа из массива в список.
Не совсем корректно (т.к ....) но результат на лицо.
'
Есть еще нюансЫ...
-------------------------------------------------------------------
При выборке с And возвращается 0.
Это хорошо или плохо ????
-------------------------------------------------------------------
Надеюсь никого не обидел. :lol:
Но мне кажется вопрос остается открытым ->....
Dmitrich

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 11.08.2003 (Пн) 2:03

НАКАЛ МЫСЛЕЙ РАСТЕТ!?
Изначально имелись ввиду обычные Long или Integer.
В тестах использовал простой цикл из 10^6 шагов команды присваивания.
То бишь, ничего лишнего:

a=число And 1 (181 мС)
или
a=число Mod 2 (начиная от 258 мС, причем зависит от разрядности числа)

Замер проводился DX-Music таймером.
Касаемо Query и массивов вопрос становится только более интересным!

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 11.08.2003 (Пн) 2:22

Он по прежнему не решен, а жаль.. это было бы интересно.
-----------------------------------------------------------------------
Чем плох Query :?:

А массив действительно в эталонных тестах никчему. Я мерил и без него тот-же integer и long.

Да только время по прежнему приблизительно одинаковое. Хотя и существенно меньше ближе к 0,00125.
Dmitrich

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 11.08.2003 (Пн) 2:43

Может в такой разнице виноват мой Duron...точки плохо плавает?

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 11.08.2003 (Пн) 3:13

Да нет пожалуй не Duron.
---------------------------------------
Всетаки мне кажется это от переключения задач.
свежий тест на XP Pro P4 -1700

And от 0,0049 до 0,0059
Mod от 0,0055 до 0,0069

а предидущий тест на XP Corp P III x 2 был.
А ведь написанно что функция не прерывается.
-------------------------------------------------------------
Кому верить ??? :shock:
Dmitrich

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 11.08.2003 (Пн) 3:24

Фиг его знает, сейчас повторил тест и получил другие результы (примерно равно), ВОТ и ВСЕ!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.08.2003 (Пн) 8:06

А вот ещё результаты.

Из VBE:
mod - 75 мс
and - 60 мс

Откомпилированный экзешник:
Оба варианта - случайное число от 0 до 9 мс.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GoGosha
Постоялец
Постоялец
 
Сообщения: 642
Зарегистрирован: 02.08.2002 (Пт) 9:14
Откуда: Russia

Сообщение GoGosha » 11.08.2003 (Пн) 9:54

ЯВНОЕ ПРЕИМУЩЕСТВО AND!
Остатки отрицательных чисел вычисляются ПРАВИЛЬНО
-5 Mod 2 = -1(неправильно)
-5 And 1 = 1 (правильно)

Код: Выделить всё
Private Sub Form_Load()
    Dim a As Long
    Dim b As Long
    Dim c As Long
    Dim Time1 As Single
    Dim Time2 As Single
    Dim Time3 As Single
   
    Time1 = Timer
    For c = 0 To 50000000
        a = 1
    Next c
    Time1 = Timer - Time1
   
    Time2 = Timer
    For c = 0 To 50000000
        a = 5 And 1
    Next c
    Time2 = Timer - Time2 - Time1
   
    Time3 = Timer
    For c = 0 To 50000000
        a = 5 Mod 2
    Next c
    Time3 = Timer - Time3 - Time1
   
    MsgBox Round(Time2, 4) & vbNewLine & Round(Time3, 4)
    Print a
End Sub
http://poetry.mooo.com
http://poetry.myboard.info
«Человек есть нечто, что до́лжно превзойти» (Ф. Ницше)

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 11.08.2003 (Пн) 13:45

Код: Выделить всё
Private Function IsEven(Number As Long) As Boolean
If Right(Number, 1) = 0 Or Right(Number, 1) = 2 Or Right(Number, 1) = 4 Or Right(Number, 1) = 6 Or Right(Number, 1) = 8 Then IsEven = True Else IsEven = False
End Function

:idea:

Например:
Код: Выделить всё
Private Sub Command1_Click()
If IsEven(Text1.Text) Then MsgBox "Чётное" Else MsgBox "Нечётное"
End Sub
Нет меня больше

ToT
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 10.06.2002 (Пн) 11:56
Откуда: Russia, Taganrog

Сообщение ToT » 11.08.2003 (Пн) 17:00

Четность ведь зависит от нулевого бита? Значит надо его и проверять
If (num and 1) then Nechet
Причем And должно быть быстрее (по моим замерам так и выходит). Операция деления вообще медленная(стравнительно со сложением например), так что And ее сделает без особого труда.
Keyboard not found. Press any key.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Yandex-бот и гости: 3

    TopList