как сделать, чтоб присвоить переменной знак от другой переменной?
y=(x>0)*2-1; ?????
а как-то попроще нельзя?
По идее лобовая if-else конструкция должна работать быстрее. Побитовых операций в MQL нет, так что пока мне ничего лучше в голову не пришло.
y=(x>0)*2-1; ?????
а как-то попроще нельзя?
Побитовых операций в MQL нет
Вообще-то есть:
Побитовые операции
Дополнение до единицы значения переменной. Значение выражения содержит 1 во всех разрядах, в которых значение переменной содержит 0, и 0 во всех разрядах, в которых значения переменной содержит 1.
b = ~n;
Двоичное представление x сдвигается вправо на y разрядов. Сдвиг вправо логический, то есть освобождающиеся слева разряды будут заполняться нулями.
Пример:
x = x >> y;
Двоичное представление x сдвигается влево на y разрядов; освобождающиеся справа разряды заполняются нулями.
Пример:
x = x << y;
Побитовая операция И двоичных представлений x и y. Значение выражения содержит 1 (ИСТИНА) во всех разрядах, в которых и x, и y содержат не ноль; и 0 (ЛОЖЬ) во всех остальных разрядах.
Пример:
b = ((x & y) != 0);
Побитовая операция ИЛИ двоичных представлений x и y. Значение выражения содержит 1 во всех разрядах, в которых x или y не содержит 0, и 0 - во всех остальных разрядах.
Пример:
b = x | y;
Побитовая операция исключающее ИЛИ (EXCLUSIVE OR) двоичных представлений x и y. Значение выражения содержит 1 в тех разрядах, в которых x и y имеют разные двоичные значения, и 0 - во всех остальных разрядах.
Пример:
b = x ^ y;
Замечание: Битовые операции выполняются только с целыми числами.
Дополнение до единицы значения переменной. Значение выражения содержит 1 во всех разрядах, в которых значение переменной содержит 0, и 0 во всех разрядах, в которых значения переменной содержит 1.
b = ~n;
Двоичное представление x сдвигается вправо на y разрядов. Сдвиг вправо логический, то есть освобождающиеся слева разряды будут заполняться нулями.
Пример:
x = x >> y;
Двоичное представление x сдвигается влево на y разрядов; освобождающиеся справа разряды заполняются нулями.
Пример:
x = x << y;
Побитовая операция И двоичных представлений x и y. Значение выражения содержит 1 (ИСТИНА) во всех разрядах, в которых и x, и y содержат не ноль; и 0 (ЛОЖЬ) во всех остальных разрядах.
Пример:
b = ((x & y) != 0);
Побитовая операция ИЛИ двоичных представлений x и y. Значение выражения содержит 1 во всех разрядах, в которых x или y не содержит 0, и 0 - во всех остальных разрядах.
Пример:
b = x | y;
Побитовая операция исключающее ИЛИ (EXCLUSIVE OR) двоичных представлений x и y. Значение выражения содержит 1 в тех разрядах, в которых x и y имеют разные двоичные значения, и 0 - во всех остальных разрядах.
Пример:
b = x ^ y;
Замечание: Битовые операции выполняются только с целыми числами.
P.S. Я имел в виду if(x<0) y=-MathAbs(y); else y=MathAbs(y);
или, +- 1, если как в примере.
Это к посту Myxu
Наличие побитовых операций даёт повод для приятных размышлений :)
или, +- 1, если как в примере.
Это к посту Myxu
Наличие побитовых операций даёт повод для приятных размышлений :)
Я уже много забыл, но если знак определяется левым битом, то для +- 1 по идее y = 1 | (x & 0x80000000) (чистим биты x, кроме старшего и складываем с 1), или, для перемены знака y = (y & 0x7FFFFFFF) | (x & 0x80000000) (чистим левый бит y и складываем). Нуждается в проверке, разумеется.
Нет, не работает, попробую разобраться (Это добавлено позже, когда я до МТ добрался).
Нет, не работает, попробую разобраться (Это добавлено позже, когда я до МТ добрался).
как сделать, чтоб присвоить переменной знак от другой переменной?
y=(x>0)*2-1; ?????
По идее лобовая if-else конструкция должна работать быстрее. Побитовых операций в MQL нет, так что пока мне ничего лучше в голову не пришло. y=(x>0)*2-1; ?????
а это разве по сути не if-then конструкция?
а MathAbs разве не вызов функции?
а количество битов в double и в int разное.. хотя это не важно, т.к.
битовые операции выполняются только с целыми числами.
а для снятия знака можно сдвинуть влево, а потом вправо.
только что подумал, что целое число можно сдвинуть вправо на все биты, кроме последнего...
а это разве по сути не if-then конструкция?
Да, только добавлено умножение и вычитаниеа MathAbs разве не вызов функции?
Да. А как без неё превратить +-1 в знак конкретного числа? Если это критично, имеет смысл проверить скорость. Вдруг разработчики для неё inline подстановку делают?То что я писал не работает потому что я забыл про представление в дополнительном коде :(. Надо ещё подумать.
а это разве по сути не if-then конструкция?
Да, только добавлено умножение и вычитание
Похоже я поддался ifобоязни :). Вот это тоже должно работать:
if((x^y)>>31) y=-y;
Но проверять не буду :)
if((x^y)>>31) y=-y;
Но проверять не буду :)
Для ненулевых можно просто:
y = x / MathAbs(x)
Думаю, быстрее сравнений будет.
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
y=(x>0)*2-1; ?????
а как-то попроще нельзя?
p.s. извините за тупой вопрос.