Сравнение двух целых чисел без любого сравнения

Вы можете добавить сервис Action в свой компонент и затем подписаться на него, чтобы прослушивать при отправке действия « CreatePositionSuccess ».

Например, в вашем компоненте:

import { Actions } from '@ngrx/effects';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';

export class SampleClass implements OnInit, OnDestroy {
  private unsubscribe$ = new Subject<void>();

  //Injecting the service
  constructor(private actions$: Action){}

  onInit() {
    this.actions$
    .pipe(
      ofType<CreatePositionSuccess>(CREATE_POSITION_SUCCESS),
      // You can add more operator if it is necessary into the observable.
      takeUntil(this.unsubscribe$)
    )
    .subscribe(() => {
      // Here you can execute the reset function
    });
  }

  onDestroy() {
    this.unsubscribe$.next();
    this.unsubscribe$.complete();
  }
}

При этом вы сможете сбросить форму сразу же после вызова успешного действия.

Кстати, субъект «отписаться» используется для автоматической отмены подписки на Observable при уничтожении компонента, чтобы избежать утечек памяти. Вы можете заметить, как я использовал его в методе уничтожения.

11
задан gsamaras 14 July 2016 в 21:24
поделиться

10 ответов

Вычтите их и проверьте знак с помощью противных взломов битового жонглирования
http://graphics.stanford.edu/~seander/bithacks.html

Не делайте этого в производственном коде, если другие программисты знают, где Вы живете.

37
ответ дан 3 December 2019 в 01:16
поделиться

Вот забавная версия битового жонглирования, которая не имеет никаких условных переходов.

int g = (int)"greater";
int l = (int)"less";
int e = (int)"equal";

int a = 7;
int b = 10;

char *result = (char*)((((a - b) >> 31) & l) | (((b - a) >> 31) & g) | ((~((a - b) | (b - a))) >> 31) & e);
cout << result;
5
ответ дан 3 December 2019 в 01:16
поделиться
char c;
c=0x3D + (!(b/a) && (a-b)) - (!(a/b) && (a-b));
printf("a %c b",c);
1
ответ дан 3 December 2019 в 01:16
поделиться

Не один из образцов, представленных в вопросе или любом из ответов к настоящему времени, защищает от деления на нуль. С какой стати Вы стараетесь избегать 'если' оператор? Я подозреваю вопрос о домашней работе о?: операторы.

cout << "Maximum is: " << ((a>b)?a:b)

Вот так.

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

1
ответ дан 3 December 2019 в 01:16
поделиться

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

Если просто необходимо отобразить более низкое количество, можно также использовать арифметические приемы:

result = ((a + b) - sqrt((a - b) * (a - b))) / 2

ОТРЕДАКТИРУЙТЕ erm …, Вам разрешают использовать switch?

Я должен использовать операторы переключения и арифметические операторы.

switch в основном то же, как объединено в цепочку if и как таковой это также использует сравнение. Это звучит, как будто необходимо действительно просто выдержать сравнение с нулем для наблюдения что знак a - b имеет.

1
ответ дан 3 December 2019 в 01:16
поделиться

Я просто наклон вижу любые серьезные основания, чтобы сделать это: кто хотел бы программировать без "если"?

возможный ответ:

((+ b) + брюшной пресс (-b)) / 2

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

0
ответ дан 3 December 2019 в 01:16
поделиться
(!(a/b) ?  cout << " b is greater than a" : (!(b-a) ? cout << "a and b are equal" :  cout << "a is greater than b") :  cout << "a is greater than b");

Это становится немного грязным хотя

Править: Эта домашняя работа?

0
ответ дан 3 December 2019 в 01:16
поделиться

Извращенная Идея: используйте массив указателей функции. Затем с некоторыми арифметическими и битовыми операциями получают индекс в тот массив.

0
ответ дан 3 December 2019 в 01:16
поделиться

Как бессмысленное осуществление, вот способ реализовать a cond функция - для служения цели if, предположение его (и switch, и ?:) так или иначе исчез из языка, и Вы используете C++ 0x.

void cond(bool expr, std::function<void ()> ifTrue, std::function<void ()> ifFalse)
{
    std::function<void ()> choices[2] = { ifTrue, ifFalse };
    choices[expr == false]();
}

например.

cond(x > y,
    /*then*/ [] { std::cout << "x is greater than y"; },
    /*else*/ [] { std::cout << "x is not greater than y"; });

Как я говорю, бессмысленный.

0
ответ дан 3 December 2019 в 01:16
поделиться
void greater(int a, int b) {
    int c = a - b;
    switch(c) {
        case 0:
            cout << "a and b are equal" << endl;
            break;
        default:
            int d = c & (1<<31);
            switch(d) {
                case 0:
                    cout << "a is bigger than b" << endl;
                    break;
                default:
                    cout << "a is less than b" << endl;
            }
    }
}
-2
ответ дан 3 December 2019 в 01:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: