Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Как уменьшить такую конструкцию?   Найти похожие ветки 

 
Tuk   (2010-01-31 04:50) [0]

if A > 1 then
begin
 if not B then
     ChangeSize;
end
else
 if B then
   ChangeButtonSize;


 
Tuk   (2010-01-31 04:55) [1]

Ой правильно будет так:

if A > 1 then
begin
if not B then
    ChangeSize;
end
else
if B then
  ChangeButton;


 
KilkennyCat ©   (2010-01-31 05:44) [2]

if A > 1 then if B then ChangeButton else ChangeSize;


 
test ©   (2010-01-31 06:01) [3]

if (A > 1) and B then ChangeButton else ChangeSize;


 
Tuk   (2010-01-31 06:11) [4]

Я извиняюсь, видимо ночь влияет.
Эти два метода одинаковы. :)
Вот окончательный вариант. Еще раз сорри, я не специально.

if A > 1 then
begin
if not B then
   ChangeSize;
end
else
if B then
 ChangeSize;


 
KilkennyCat ©   (2010-01-31 10:19) [5]


> test ©   (31.01.10 06:01) [3]

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


 
jack128_   (2010-01-31 11:13) [6]

if (A > 1) <> B then
 ChangeSize();


 
Кто б сомневался ©   (2010-01-31 16:13) [7]

if (A > 1) xor B then
ChangeSize();


 
Кто б сомневался ©   (2010-01-31 16:14) [8]

Мой вариант быстрее [6] и круче выглядит :).


 
Игорь Шевченко ©   (2010-01-31 18:57) [9]


>  быстрее [6]


На каком основании ?


> и круче выглядит :).


Это имеет решающее значение для увольнения


 
Jeer ©   (2010-01-31 21:29) [10]


> Игорь Шевченко ©   (31.01.10 18:57) [9]


Ну как ты не понял - его варианте использован bold-шрифт. :)


 
Rouse_ ©   (2010-01-31 21:37) [11]


> Кто б сомневался ©   (31.01.10 16:14) [8]
> Мой вариант быстрее [6] и круче выглядит :).

За такие чудеса уже много крутышек поувольняли :)


 
KilkennyCat ©   (2010-01-31 22:01) [12]

можно еще короче: ChangeSize(A, B);


 
Кто б сомневался ©   (2010-01-31 22:42) [13]


> Это имеет решающее значение для увольнения


if (A > 1) xor B then
ChangeSize();

Чем не нравится? Вариант полностью рабочий, не путанный и прозрачный. Или может программисту трудно понять что делает xor?
Значит это не программист - это его проблемы с квалификацией.


 
Игорь Шевченко ©   (2010-01-31 22:43) [14]


> Или может программисту трудно понять что делает xor


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


 
Кто б сомневался ©   (2010-01-31 22:44) [15]

Тогда в чем проблема в [9]? Уточните.


 
Кто б сомневался ©   (2010-01-31 22:45) [16]


> Игорь Шевченко ©   (31.01.10 18:57) [9]
>
>
> >  быстрее [6]
>
>
> На каком основании ?


На том основании что XOR быстрее CMP


 
Jeer ©   (2010-01-31 22:52) [17]


> Кто б сомневался ©   (31.01.10 22:44) [15]
>
> Тогда в чем проблема в [9]? Уточните.


Проблема в том, что тебя за такое "смешивание" прикладной и асм. логики не то, что уволят, но даже на работу не возьмут.


 
Кто б сомневался ©   (2010-01-31 22:55) [18]


> Проблема в том, что тебя за такое "смешивание" прикладной
> и асм. логики не то,


Что за бред уважаемый.

If A or B then  или
if A and B then -

Встречается на каждом шагу битовая логика, вы с луны что-ли свалились?


 
Кто б сомневался ©   (2010-01-31 22:55) [19]

Или недоучились?


 
Игорь Шевченко ©   (2010-01-31 22:55) [20]

Кто б сомневался ©   (31.01.10 22:44) [15]

В 9 нет проблем


> На том основании что XOR быстрее CMP


Точно быстрее ? Готов аргументировать ?


 
Кто б сомневался ©   (2010-01-31 22:58) [21]

Jeer ©   (31.01.10 22:52) [17]

If A or B then  или
if A and B then
If not A and B then
if not A then
if A or not B then

Вы посмотрите в какой нибудь хороший код, хотя бы в VCL -там такое частенько встречается.


 
Кто б сомневался ©   (2010-01-31 22:59) [22]


> Точно быстрее ? Готов аргументировать ?


Ты сначала свои аргументы покажи, почему CMP быстрее (или равно) XOR  будет..


 
Jeer ©   (2010-01-31 23:05) [23]


> Кто б сомневался ©   (31.01.10 22:55) [19]
>
> Или недоучились?


Все на что смог твой мозг ?


 
Игорь Шевченко ©   (2010-01-31 23:07) [24]

Кто б сомневался ©   (31.01.10 22:59) [22]

Слив защитан


 
Jeer ©   (2010-01-31 23:08) [25]

> Кто б сомневался ©   (31.01.10 22:58) [21]


Иди и подумай разницу между битовой и прикладной логикой.


 
Anatoly Podgoretsky ©   (2010-01-31 23:16) [26]


> Кто б сомневался ©   (31.01.10 22:59) [22]

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


 
Кто б сомневался ©   (2010-01-31 23:23) [27]


> второе нафиг нужно, лучше более естественноые, более понятные
> конструкции без выкрутасов.


Что значит более естественные? Что тут понимать, трудно понять что такое исключающее или?
чем оно менее естественнее для программиста чем <>?

если вы говорите про ествественное "или", которые использует человек (т.е. тот самый союз "или" - кошка или собака), то
это как раз xor, а не or - т.к. человек обычно выбирает или одно , или другое (xor), а не одно или другое или сразу и то и другое вместе (как в случае с or).


 
Кто б сомневался ©   (2010-01-31 23:24) [28]


> обычно выбирает


Точнее имеет в виду. Не два предмета, а один из них.


 
Anatoly Podgoretsky ©   (2010-01-31 23:26) [29]

> Кто б сомневался  (31.01.2010 23:23:27)  [27]

Ты не читай мне лекцию, что такое XOR ты ближе к телу.


 
KilkennyCat ©   (2010-01-31 23:27) [30]


> Иди и подумай разницу между битовой и прикладной логикой.

а каким местом это?

Собственно, ни у кого не вызывает проблем  if (a > b) and (c > d) ? Тогда почему вызывает проблема хоr? not, and, or и xor - все из одной кучи.


 
Кто б сомневался ©   (2010-01-31 23:31) [31]


> Anatoly Podgoretsky ©   (31.01.10 23:26) [29]
>
> > Кто б сомневался  (31.01.2010 23:23:27)  [27]
>
> Ты не читай мне лекцию, что такое XOR ты ближе к телу.


вот опять вы возмущаетесь. Опять не хотите признавать очевидное.
Если человек использует союз "или" в жизни, то он будет XOR по свойству, а не OR.

Условие:
АП или ИШ .
Или тот или тот. Но не как не оба. Понимаете? это xor .


 
xayam ©   (2010-01-31 23:34) [32]

Удалено модератором


 
test ©   (2010-01-31 23:36) [33]

Ничто не предвещало беды ))


 
Anatoly Podgoretsky ©   (2010-01-31 23:45) [34]

Простейшия проверка показала резкий выигрыш "CMP" при сравнение на 2 миллиардах иттераций. XOR в три раза медленнее.

procedure TForm1.Button1Click(Sender: TObject);
var
 a: Integer;
 i:Integer;
 b: boolean;
 t:Integer;
 c: boolean;
begin
 a:=1;
 b:=true;
 t:=gettickcount;
 for I := 0 to 2000000000 - 1 do
 c := (a>1) xor b;
 ShowMessage(Inttostr(GetTickCount-t));  // 2543
 if c then Label1.Caption := "true" else Label1.Caption := "false";
 t:=gettickcount;
 for I := 0 to 2000000000 - 1 do
 c := (a>1) <> b;
 ShowMessage(Inttostr(GetTickCount-t)); //843
end;


 
test ©   (2010-01-31 23:48) [35]

Anatoly Podgoretsky ©   (31.01.10 23:45) [34]
Зато авто обфускация кода при использование xor и зубодробильных выражений на порядок выше!


 
Юрий Зотов ©   (2010-01-31 23:50) [36]

Когда я вижу, что XOR дает ниболее простую конструкцию, то без тени сомнения XOR и применяю. Правда, за всю многолетнюю практику такое случалось всего лишь несколько раз, но если уж встретилось - то без тени сомнения.

И тоже считаю, что:
- xor ничем не хуже других логических операций;
- программист операции с xor понимать обязан.


 
Anatoly Podgoretsky ©   (2010-01-31 23:50) [37]

Ты обсуждаем вполне реальный код и утверждения, которые не подтвердились, по крайней мере на моем процессоре. Ассемблерный код почти одинаковый CMP/XOR


 
Кто б сомневался ©   (2010-02-01 00:13) [38]


> Простейшия проверка показала резкий выигрыш "CMP" при сравнение
> на 2 миллиардах иттераций. XOR в три раза медленнее.


ну да, только там еще был запущен SR и плюс Макафи и куча остальных прог. И плюс винда со своей поточной каруселью.

Насколько я помню, cmp выполняется за 3 такта, xor за 2 или за один. Вот только книжку не могу найти.
Обычно в книгах по асму в конце пишут за сколько тактов выполняется  команда на x86 - у кого есть посмотрите.


 
Игорь Шевченко ©   (2010-02-01 00:18) [39]

Юрий Зотов ©   (31.01.10 23:50) [36]


> И тоже считаю, что:
> - xor ничем не хуже других логических операций;
> - программист операции с xor понимать обязан.


прокомментируй высказывание оратора в [8], "круче выглядит".

Заодно можно прокомментировать следующие части кода:
var
 Literal: Boolean;
....
 if IsLiteral then
 begin
    Literal := Literal xor True;
    ....
 end;
...
 else if IsLiteral then Literal := Literal xor True;


 while (P^ <> #0) and not (Negate xor (UpCase(P^) in CharSet^)) do Inc(P);


 
xayam ©   (2010-02-01 00:18) [40]


> Anatoly Podgoretsky ©   (31.01.10 23:45) [34]

xor - 6984
cmp - 2468


 
Кто б сомневался ©   (2010-02-01 00:20) [41]


> Простейшия проверка показала резкий выигрыш "CMP" при сравнение
> на 2 миллиардах иттераций. XOR в три раза медленнее.


О. Я понял почему.

Оптимизатор то молодец..  :)

Вот это ваш cmp код:

//for I := 0 to 5 - 1 do
 mov eax,$00000005
 dec eax
 jnz $0046cd2c

А вот это ваш xor код :

// for I := 0 to 5 - 1 do
 mov eax,$00000005
//  c := (a>1) xor b;
 cmp esi,$01
 setnle dl
 xor dl,bl
 mov [ebp-$05],dl
 //  for I := 0 to 5 - 1 do
 dec eax
 jnz $0046ccc9


 
Игорь Шевченко ©   (2010-02-01 00:21) [42]


> Обычно в книгах по асму в конце пишут за сколько тактов
> выполняется  команда на x86 - у кого есть посмотрите.


У меня есть. За 1 такт. Но это на старых процессорах, у меня книжка по 486-у.

На более современных о времени выполнения в тактах говорить бессмысленно.


 
Кто б сомневался ©   (2010-02-01 00:21) [43]

Вот поэтому он быстрее, т.к. на константах делать не надо.


 
Anatoly Podgoretsky ©   (2010-02-01 00:22) [44]

> Кто б сомневался  (01.02.2010 00:13:38)  [38]

И заметь вся эта карусель не отключалась и при проверке на CMP, точно также как и для XOR
Не знаю, кто такой SR, но влияние McAfee как и любого антивируса 0, оно может и тормозит при запуске, но никак не мешает уже при прогоне.
Касательно книжек, ты их выбрось, они не имеют смысла после 386/486. Аналогично и для ADD и INC по книжкам INC круче, а на практике наоборот.
Короче ты слил, доказательства не стал приводить, отделался головословными утверждениями.


 
xayam ©   (2010-02-01 00:23) [45]

Удалено модератором


 
Anatoly Podgoretsky ©   (2010-02-01 00:26) [46]

> xayam  (01.02.2010 00:18:40)  [40]

Другой процессор, но все равно XOR проигрывает. Я думаю если найти 486 процессор, может хотя бы там он покажет свою СИЛУ.

Нравятся мне эти знатоки ассеблера, которые оперируют данными начала 80 годов. В итоге у них код на ассеблере получается медленнее эквивалента на Паскале.


 
Anatoly Podgoretsky ©   (2010-02-01 00:28) [47]

> Кто б сомневался  (01.02.2010 00:20:41)  [41]

Так ты еще и асм код читать не умеешь, да CMP выдаешь обработку цикла FOR


 
Anatoly Podgoretsky ©   (2010-02-01 00:29) [48]

> Игорь Шевченко  (01.02.2010 00:21:42)  [42]

Не помню какой именно вариант Пентиума выполнял 5!!! команд за так, когда без пенальти. Core 2 хуже


 
xayam ©   (2010-02-01 00:29) [49]


> Anatoly Podgoretsky ©   (01.02.10 00:26) [46]
> > xayam  (01.02.2010 00:18:40)  [40]
> Другой процессор, но все равно XOR проигрывает.

я тут вспомнил, что у меня распределенные вычисления считают, отключил

xor - 3766
cmp - 1375

все равно проигрывает


 
Anatoly Podgoretsky ©   (2010-02-01 00:30) [50]

> xayam  (01.02.2010 00:23:45)  [45]

Конечно, даже подлоги использует, видимо специально.


 
Кто б сомневался ©   (2010-02-01 00:33) [51]


> Anatoly Podgoretsky ©   (01.02.10 00:28) [47]
>
> > Кто б сомневался  (01.02.2010 00:20:41)  [41]
>
> Так ты еще и асм код читать не умеешь, да CMP выдаешь обработку
> цикла FOR


Да неужели?

А может cmp это A>1?
У вас компилятор оптимизировал константы. весь ваш код
for I := 0 to 2000000000 - 1 do
c := (a>1) <> b;

Он превратил в
//for I := 0 to 5 - 1 do
mov eax,$00000005
dec eax
jnz $0046cd2c


 
KilkennyCat ©   (2010-02-01 00:33) [52]

Я, наверное, тупой программист, но я так и не понял, чем в изначальной задаче применение xor вызвало негативную реакцию (приведенные впоследствии примеры считаю несущественными, ибо есть орешник - там тоже всякого хватает).
Остается только спросить, если бы слово "круче" не прозвучало, реакция была бы такая же?


 
Игорь Шевченко ©   (2010-02-01 00:41) [53]

KilkennyCat ©   (01.02.10 00:33) [52]


> но я так и не понял, чем в изначальной задаче применение
> xor вызвало негативную реакцию


Въезжать дольше.


 
Кто б сомневался ©   (2010-02-01 00:42) [54]

Короче вот правильный код, АП ошибся.

procedure TForm1.Button1Click(Sender: TObject);
var
a: boolean;
i:Integer;
b: boolean;
t:Integer;
c: boolean;
begin
{$O-}

a:= false;
b:=true;
t:=gettickcount;
for I := 0 to 2000000000 - 1 do
  c := a xor b;

ShowMessage(Inttostr(GetTickCount-t));
if c then Caption := "true" else Caption := "false";
t:=gettickcount;
for I := 0 to 2000000000 - 1 do
  c := a <> b;

ShowMessage(Inttostr(GetTickCount-t));

end;


 
Кто б сомневался ©   (2010-02-01 00:43) [55]


> АП ошибся.


см. 51. сработал оптимизатор на константах.


 
KilkennyCat ©   (2010-02-01 00:44) [56]


> Игорь Шевченко ©   (01.02.10 00:41) [53]

Нечитабельно?
Но кому-то другому, а не написавшему. 99% моих исходников никто не увидит, потому что нафиг никому не нужно, и что, мне мучаться и писать удобно да еще с комментариями?


 
Кто б сомневался ©   (2010-02-01 00:44) [57]

который удалил код сравнения ( c := a <> b) . Т.е. не на константах, а на С, которая нигде не использовалась дальше.


 
xayam ©   (2010-02-01 00:46) [58]


> Кто б сомневался ©   (01.02.10 00:42) [54]

xor - 5547
cmp - 7375


 
Кто б сомневался ©   (2010-02-01 00:47) [59]


> Игорь Шевченко ©   (01.02.10 00:41) [53]
>
> KilkennyCat ©   (01.02.10 00:33) [52]
>
>
> > но я так и не понял, чем в изначальной задаче применение
>
> > xor вызвало негативную реакцию
>
>
> Въезжать дольше.


Зачем вы всех равняете по себе. Ведь в A or B не долго въезжать?
Почему тогда A xor B дольше?
Я к примеру сразу "въезжаю", собственно посмотрев на конструкцию if a <> b - сразу предложил вариант.


 
Игорь Шевченко ©   (2010-02-01 00:51) [60]

KilkennyCat ©   (01.02.10 00:44) [56]

Читабельно. Въезжать дольше.

Есть один тонкий момент - со своим кодом каждый программист волен делать, что угодно и никто ему (тем более на delphimaster) не указ. Но когда начинается работа в команде с кодом, обладающем длительным жизненным циклом, тратить время на разбор высеров гениальности не хочется. Поэтому от подобных любителей крутизны стараются избавиться. Чаще всего, увольнением.

Кстати, код, который я привел в [39] - это из VCL. Первый кусок из AdoDB.pas и DB.pas, второй из Classes.pas


 
KilkennyCat ©   (2010-02-01 00:58) [61]


> Игорь Шевченко ©   (01.02.10 00:51) [60]


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


 
Кто б сомневался ©   (2010-02-01 01:03) [62]


> Поэтому от подобных любителей крутизны стараются избавиться.
>  Чаще всего, увольнением.


Все, ты уволен! Над этой твоей конструкцией "a xor b" наши программисты чуть не сломали свои бедные головушки.. :)


 
KilkennyCat ©   (2010-02-01 01:13) [63]


> Кто б сомневался ©   (01.02.10 01:03) [62]

Зря смеешься, кто-то когда-то рассказывал, как тупому программисту в штатах обеспечили супер-пупер условия работы на курорте, лишь бы домучал свою тупейшую часть работы, в то время, когда нормальные трудились в обычном офисе. Я думаю, в конечном итоге он стал начальником.


 
Кто б сомневался ©   (2010-02-01 01:20) [64]


>  else if IsLiteral then Literal := Literal xor True;


Здесь это конечно не в тему.
Т.к. быстрее и круче будет написать

else if IsLiteral then
 Literal := not Literal;

Но таких случаев исключительных можно с любым оператором придумать.
А в сабже топика я выбрал бы именно xor - т.к. до меня эта конструкция доходит по скорости понимания так же как и <>.
Здесь все зависит от того как часто вы работаете с битовой логикой, ваш случай ИШ говорит что вы просто подзабыли немного ее да и все - поэтому вам нужно вспоминать и прокручивать это в голове при чтении кода.
И конечно же по такому поводу никто увольнять не будет, да и выговаривать тоже.


 
xayam ©   (2010-02-01 01:24) [65]

Удалено модератором


 
Аноним ©   (2010-02-01 01:24) [66]

что ж сделают со мной.. я все больше на лиспе пишу
жуть


 
xayam ©   (2010-02-01 01:27) [67]


> Аноним ©   (01.02.10 01:24) [66]
> что ж сделают со мной.. я все больше на лиспе пишу
> жуть

а меня тут пролог заинтересовал, интересный язык


 
KilkennyCat ©   (2010-02-01 01:29) [68]

Вас не уволят, вас просто не возьмут на работу. А если и возьмут, то уволят через суд, будете еще должны предприятию за моральный ущерб аморальным программированием причиненный.


 
Аноним ©   (2010-02-01 01:32) [69]


> за моральный ущерб аморальным программированием причиненный.

дык, это моя цель :-)


 
Германн ©   (2010-02-01 01:39) [70]


> KilkennyCat ©   (01.02.10 01:29) [68]
>
> Вас не уволят, вас просто не возьмут на работу.

Возьмут. Не ври. Если приемом на работу заведует грамотный специалист. За исключением приема на "работу в команду".
Хотя, конечно, инструкция XOR выглядит "чужеродной" в данной конструкции.


 
KilkennyCat ©   (2010-02-01 01:45) [71]

да каким же местом она все-таки чужеродна?!
Почему or, not, and не чужеродны?
И Германн, тебе, с электроникой возящемуся, она ваще должна быть своя в доску.


 
Кто б сомневался ©   (2010-02-01 02:00) [72]


> KilkennyCat ©   (01.02.10 01:45) [71]


+1 я тоже не пойму. or, and, not, не чужеродны, - все чет пишут, а xor чужеродный, хотя из одной бочки. Что за дискриминация XOR?


 
Германн ©   (2010-02-01 02:04) [73]


> KilkennyCat ©   (01.02.10 01:45) [71]
>
> да каким же местом она все-таки чужеродна?!
> Почему or, not, and не чужеродны?
> И Германн, тебе, с электроникой возящемуся, она ваще должна
> быть своя в доску.
>

Мне, как раз, она "своя в доску"!
А вот другим!
XOR работает с битами. С конкретными битами!
В Windows "прозрачно" реализована работа с битовыми масками. И там "or, not, and" вполне понятны. Но ведь там по сути есть работа с байтами!


 
Игорь Шевченко ©   (2010-02-01 02:14) [74]

KilkennyCat ©   (01.02.10 01:45) [71]


> да каким же местом она все-таки чужеродна?!


Побитовая - не чужеродна. В условном выражении чужеродна.

Мастурбация^^^^^^^^^^^Гимнастика для ума начинается, когда xor используется более одного раза в выражении. С and и or все понятно быстрее, до первого нуля или единицы.


 
Германн ©   (2010-02-01 02:21) [75]


> В условном выражении чужеродна.

Тоже криво сказано.


 
vuk ©   (2010-02-01 02:36) [76]

to Германн ©   (01.02.10 02:04) [73]:

> XOR работает с битами. С конкретными битами!


XOR - это такая же булева функция, как AND или OR. И в Delphi работает она в зависимости от применения. Если операнды целые, то побитово, если boolean, то как логическая.

Другое дело, что применение XOR в условных выражениях не всегда прозрачно и требует при чтении кода вспоминать, как выглядит таблица истинности для этой функции.


 
Германн ©   (2010-02-01 02:47) [77]


> vuk ©   (01.02.10 02:36) [76]
>
> to Германн ©   (01.02.10 02:04) [73]:
>
> > XOR работает с битами. С конкретными битами!
>
>
> XOR - это такая же булева функция, как AND или OR. И в Delphi
> работает она в зависимости от применения. Если операнды
> целые, то побитово, если boolean, то как логическая.
>

А то я это первый раз слышу.


 
vuk ©   (2010-02-01 02:51) [78]

to Германн ©   (01.02.10 02:47) [77]


> А то я это первый раз слышу.

Ну и зачем тогда писать, что XOR работает с конкретными битами?


 
Германн ©   (2010-02-01 02:57) [79]


> vuk ©   (01.02.10 02:51) [78]
>
> to Германн ©   (01.02.10 02:47) [77]
>
>
> > А то я это первый раз слышу.
>
> Ну и зачем тогда писать, что XOR работает с конкретными
> битами?
>

Хм.
А ты можешь представить реально нужный пример кода в Windows, когда нужно применять XOR?


 
Германн ©   (2010-02-01 03:15) [80]


> А ты можешь представить реально нужный пример кода в Windows,
>  когда нужно применять XOR?
>

Вот and, or или not - это понятно.


 
Юрий Зотов ©   (2010-02-01 05:10) [81]

> Германн ©   (01.02.10 03:15) [80]
> А ты можешь представить реально нужный пример кода в Windows,
> когда нужно применять XOR?

Хм... а при чем тут Windows?


 
Думкин ©   (2010-02-01 07:49) [82]

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


 
KilkennyCat ©   (2010-02-01 08:34) [83]

Ну вот, пришел Думкин и 80 постов испортил :)


 
Ega23 ©   (2010-02-01 11:46) [84]


> А ты можешь представить реально нужный пример кода в Windows,
>  когда нужно применять XOR?
>


Значение регистра обнулить? Заксорить самого на себя...


 
Alx2 ©   (2010-02-01 12:01) [85]

В случае с xor у меня по удобочитаемости идет такой порядок:
1. if a<>b then ...
2. if a xor b then ...
....
1000. if (a and not b) or ((not a) and b) then...
2000. if ((not a) or (not b)) and (a or b) then...


 
TUser ©   (2010-02-01 12:15) [86]

XOR отличиается от других логических операций уже тем, что для него нет слова в русском (английском) языке. И, ИЛИ и НЕ мы в разговорной речи употребляем. ИСКЛЮЧАЮЩЕЕ_ИЛИ - ни разу не слышал.

Это показывает, что XOR гораздо реже употребляется человеками. То есть он человекам менее понятен, чем три другие операции. А стало быть из двух операций

A <> B

и

A xor B

первая понимается проще.

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


 
KilkennyCat ©   (2010-02-01 12:25) [87]


> Это показывает, что XOR гораздо реже употребляется человеками.

Ну, если электронщиков не считать человеками, то тогда да.


 
TUser ©   (2010-02-01 12:39) [88]

Если их считать человеками, то все равно - на истинность утверждения "XOR гораздо реже употребляется человеками" применительно ко всему человечеству они не повлияют. Мало их.


 
Ega23 ©   (2010-02-01 12:55) [89]

ИМХО.
Вообще не дело логические операторы и битовые одинаково именовать. Это не для конкретного языка, это "вообще".
В этом плане мне разделение в TSQL нравится. С его побитовыми &, ~, | и ^


 
Anatoly Podgoretsky ©   (2010-02-01 13:01) [90]

> KilkennyCat  (01.02.2010 12:25:27)  [87]

электронщиков не считать человеками, без всяких если.


 
Anatoly Podgoretsky ©   (2010-02-01 13:04) [91]

> Ega23  (01.02.2010 12:55:29)  [89]

Это тлетворное влияние СИ


 
Вариант   (2010-02-01 14:55) [92]


> Ega23 ©   (01.02.10 12:55) [89]


> ИМХО.
> Вообще не дело логические операторы и битовые одинаково
> именовать.

Согласен


 
Кто б сомневался ©   (2010-02-01 15:08) [93]


> TUser ©   (01.02.10 12:15) [86]


Я уже писал что человек если произносит союз "или" - подразумевает свойство XOR. Иначе надо было говорить "или\и" - а мы так не говорим.
Получается xor ("или") обычно используется повсеместно в чел. жизни.
Or (или\и) никогда - по крайнем мере в русском и англ. языке.


 
Кто б сомневался ©   (2010-02-01 15:12) [94]


> A <> B
>
> и
>
> A xor B
>
> первая понимается проще.


Опять же проще для тебя. Для меня они одинаково просто доходят, т.к. в свое время я часто с битовой логикой работал.
В твое случае ты чаще работаешь с <> чем с xor поэтому и доходит быстрее первое. На деле до программиста знающего как работает XOR но не работающего с ним - не трудно припомнить свойство - всего 3 секунды.


 
Ega23 ©   (2010-02-01 15:22) [95]

A <> B
и
A xor B

var
 A, B : real;


 
Кто б сомневался ©   (2010-02-01 15:24) [96]


> Ega23 ©   (01.02.10 15:22) [95]


Мы про boolean говорим - здесь ничего не надо вычислять.


 
xayam ©   (2010-02-01 15:33) [97]

Удалено модератором


 
Кто б сомневался ©   (2010-02-01 15:41) [98]


> xayam ©   (01.02.10 15:33) [97]


Нет, не поняли. Я имел ввиду в целом людей которые не часто работают с xor, но знают как он работает. Отправлял вчера эту конструкцию знакомому, сказал как поймешь сразу скажи как она работает (по скайпу). Он тоже программист (C#) - с xor работает не часто.

if a xor b then

Он ответил через 3 секунды. Просто знал присказку "или там или там, но не оба". :)


 
xayam ©   (2010-02-01 15:47) [99]

Удалено модератором


 
Ega23 ©   (2010-02-01 15:49) [100]


> Мы про boolean говорим - здесь ничего не надо вычислять.


Вот в том-то и дело. В случае Boolean - логическая. В случае числа - побитовая.
А если вспомнить, что false = 0, а true <> 0, то вообще всё весело.


 
KilkennyCat ©   (2010-02-01 15:56) [101]

var
 A, B : boolean;

A <> B  выглядит идиотски, так же, как if A <> true


 
Кто б сомневался ©   (2010-02-01 16:14) [102]


> А если вспомнить, что false = 0, а true <> 0, то вообще
> всё весело.


в boolean true = 1 всегда вы ж знаете. Это не bytebool и не bool.
Вообще A+B*C - здесь больше усилий нужно, чем A xor B.
если бы детей в школе учили xor на равне с операциями + - то не было бы и таких удивлений и спора. Просто бы шло на автомате. А человеку который пишет код, имхо вообще спорить по этому поводу глупо.


 
Alx2 ©   (2010-02-01 16:27) [103]

>KilkennyCat ©   (01.02.10 15:56) [101]


> A <> B  выглядит идиотски, так же, как if A <> true


Передерну в другую сторону: для завершенности картинки, нужно юзать только Штрих Шеффера. Чтобы одна функция на все-про все, и до оторопи понятно без въездов в контекст. :)
Но ведь есть локальные документы-соглашения о стиле кодирования в конкретных конторах и проектах. Лепят по ним.  Чего зря спорить?


 
xayam ©   (2010-02-01 16:32) [104]

Удалено модератором


 
Думкин ©   (2010-02-01 16:53) [105]

По заданорй задаче 3 исхода. В один зинелфс там не получится.

Это бы в свич - для высокого языка. Это красивее. А каждый внутренний заход в кэйсе - в языкопонятную функцию.


 
Ega23 ©   (2010-02-01 16:53) [106]


> в boolean true = 1 всегда вы ж знаете. Это не bytebool и
> не bool.


нету в Boolean ни 0, ни 1, ничего другого. Есть true и есть false.
0, 1 и другие значения - это уже не Boolean.

Вот Ord(True) - да, всегда единица.


 
Думкин ©   (2010-02-01 16:57) [107]


> По заданорй задаче 3 исхода.

Извините.

> По заданой задаче 3 исхода.

так.


 
Кто б сомневался ©   (2010-02-01 17:13) [108]


> Ega23 ©   (01.02.10 15:49) [100]
> А если вспомнить, что false = 0, а true <> 0, то вообще
> всё весело.



> Ega23 ©   (01.02.10 16:53) [106]
> нету в Boolean ни 0, ни 1, ничего другого. Есть true и есть
> false.
> 0, 1 и другие значения - это уже не Boolean.


Сам же написал. И сам же отрицаешь.. :)

Есть в boolean и ноль и один. Просто интерпретация его как 0 - false 1 - true.
неважно как называется, можно назвать как черное и белое или как да и нет или как 0 и 1 - суть одна.
Ну а если строго на язык смотреть, тогда да, true и false. Но тогда это касается всех - и bool и bytebool и longbool итд.


 
Кто б сомневался ©   (2010-02-01 17:15) [109]


> Ну а если строго на язык смотреть, тогда да, true и false.


А вообще нет, если строго смотреть ,тогда как раз есть ноль и один. Просто для удобства назвали его false и true. Двоичная система.


 
tesseract ©   (2010-02-01 17:22) [110]


> А вообще нет, если строго смотреть ,тогда как раз есть ноль
> и один.


C COM работал? Там всё глубоко наоборот.


 
Думкин ©   (2010-02-01 17:45) [111]


> tesseract ©   (01.02.10 17:22) [110]
>
> > А вообще нет, если строго смотреть ,тогда как раз есть
> ноль
> > и один.
>
>
> C COM работал? Там всё глубоко наоборот.

Вот поэтому и не надо.

Если можно написать по русску, что две прямые пересекаются в одной точке, а вдве точки в одной прямой и еще чутка. То не стоит выносить мозг Гильбертом.

Писать надо понятно. А скорость придумывания терминов оставим философам.


 
Jeer ©   (2010-02-01 18:19) [112]


> То не стоит выносить мозг Гильбертом.


Это - да.


 
Юрий Зотов ©   (2010-02-01 22:55) [113]

> TUser ©   (01.02.10 12:15) [86]

Обоснование глыбоконаучное, спору нет.

Но как насчет "либо-либо"?

:o)


 
Ega23 ©   (2010-02-02 00:31) [114]


> Сам же написал. И сам же отрицаешь.. :)


Ты опу с пальцем путаешь.
Что будет:
if Boolean(2) then
 ShowMessage("True")
else
 ShowMessage("False")  

?


 
Не занят   (2010-02-02 02:25) [115]


> if Boolean(2)


Правда всегда одна, путей к ней много


 
Lamer@fools.ua ©   (2010-02-02 10:21) [116]

Поддержу xor. Не вижу в данном примере ничего криминального.
За один несчастный xor так наброситься на человека...

Лучше здесь перлы почитайте: http://govnokod.ru/
В частности, http://govnokod.ru/delphi


 
GrayFace ©   (2010-02-02 12:09) [117]

У меня результаты xor и <> полностью совпадают. В отличие от [34], замеры делал раздельно, на разных кнопках, иначе не достоверно.

Германн ©   (01.02.10 2:57) [79]
А ты можешь представить реально нужный пример кода в Windows, когда нужно применять XOR?

Реальный пример в голову не лезет, но
A xor B xor C
Если переводить на <>, то появятся скобки.
Гепотетический пример:
map[x, y, z]:= (x mod 2 = 0) xor (y mod 2 = 0) xor (z mod 2 = 0);
- заполнение каждой второй ячейки true.


 
GrayFace ©   (2010-02-02 12:10) [118]

по типу шахматной доски.


 
12 ©   (2010-02-02 12:16) [119]

$ifdef оффтоп

вот так еще прикольно получится
const
false = true;
true = false;
begin
if (1>0) = false then showmessage("(1>0) = false");
if (1>0) = true then showmessage("(1>0) = true");

а потом
const
true = false;
false = true;
begin
if (1>0) = false then showmessage("(1>0) = false");
if (1>0) = true then showmessage("(1>0) = true");


 
Ega23 ©   (2010-02-02 12:22) [120]


> map[x, y, z]:= (x mod 2 = 0) xor (y mod 2 = 0) xor (z mod  2 = 0);
> - заполнение каждой второй ячейки true.


А в один проход разве не судьба?


 
GrayFace ©   (2010-02-02 16:13) [121]

Т.е. если гипотетический "map" представляется 1D массивом? Все-равно нет - надо как в шахматной доске. Например, если размерность по x нечетная, то в конце одной строки и в начале следующей будут false (2 подряд в 1D представлении).


 
Ega23 ©   (2010-02-02 16:24) [122]


> Т.е. если гипотетический "map" представляется 1D массивом?
>  Все-равно нет - надо как в шахматной доске. Например, если
> размерность по x нечетная, то в конце одной строки и в начале
> следующей будут false (2 подряд в 1D представлении).


А зачем на каждой итерации (y mod 2 = 0) xor (z mod  2 = 0) вычислять?
Вообще, крайне неоптимально.


 
Кто б сомневался ©   (2010-02-02 20:04) [123]


> У меня результаты xor и <> полностью совпадают.


На один проц поставь программу. У тебя больше одного процессора. Я когда ставлю на один проц результаты разные, на два - одинаковые.


 
jack128_   (2010-02-02 23:28) [124]


> A xor B xor C
> Если переводить на <>, то появятся скобки.

почему?? a <> b <> с не компилится??


 
Jeer ©   (2010-02-02 23:42) [125]


> почему?? a <> b <> с не компилится??
>


Потому, что "Быть или не быть" ( аналог ) - тоже не "компилится".


 
GrayFace ©   (2010-02-04 11:59) [126]

Ega23 ©   (02.02.10 16:24) [122]
А зачем на каждой итерации (y mod 2 = 0) xor (z mod  2 = 0) вычислять?
Вообще, крайне неоптимально.

Это да, конечно.

Кто б сомневался ©   (02.02.10 20:04) [123]
На один проц поставь программу. У тебя больше одного процессора. Я когда ставлю на один проц результаты разные, на два - одинаковые.

Как это? Поток в любом случае один...

jack128_   (02.02.10 23:28) [124]
почему?? a <> b <> с не компилится??

Хм, точно. Хотя среда красным подчеркивает. Но, все-равно, без скобок это точно будет с трудом понимаемый код, а 3 xor"а подряд - достаточно понятно.


 
GrayFace ©   (2010-02-04 11:59) [127]

> Хм, точно.
В смысле, действительно, компилится.



Страницы: 1 2 3 4 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.82 MB
Время: 0.092 c
2-1270652923
Vincero
2010-04-07 19:08
2010.08.27
Отловить состояние клавиши [Shift] при нажатии на пункт PopupMenu


15-1264861183
Делфиец
2010-01-30 17:19
2010.08.27
Физическое чтение диска


4-1238501632
JayMax
2009-03-31 16:13
2010.08.27
Проблема с запуском системного приложения с Delphi


2-1266086179
Interesting
2010-02-13 21:36
2010.08.27
Иконка в SysTray и форма


11-1215989987
Freeman
2008-07-14 02:59
2010.08.27
KOL Format/wvsprintf performance hit