Можно ли превратить отрицательное число в положительное с помощью побитовых операций в ActionScript 3? - PullRequest
7 голосов
/ 16 июля 2011

Есть ли прямой способ, как превратить отрицательное число в положительное, используя побитовые операции в ActionScript 3?Я просто думаю, что где-то читал, что это возможно и быстрее, чем использование Math.abs() или умножение на -1.Или я ошибаюсь, и это был сон после дня, когда я изучал байты и побитовые операции?

То, что я видел, было то, что побитовое NOT почти оправдывает себя:

// outputs: 449
trace( ~(-450) );

Если кто-нибудьнайти этот вопрос и заинтересовать - за 5 миллионов итераций ~(x) + 1 на 50% быстрее, чем Math.abs(x).

Ответы [ 6 ]

14 голосов
/ 16 июля 2011

Вам нужно добавить один после получения побитового отрицания.Это свойство системы счисления с двумя дополнениями .Это не относится к Actionscript (кроме заявленной разницы в производительности).

Итак, (~(-450)+1) дает 450
, а (~(450)+1) дает -450.

Как отмечено в комментариях, этот ответ написан в ответ на вопрос, чтобы исправить незначительную проблему в эксперименте задающего вопрос.Этот ответ не является одобрением этого метода для общего использования при разработке программного обеспечения.

9 голосов
/ 16 июля 2011

Используйте правило, которое гласит

~(x) = (-x)-1
4 голосов
/ 16 июля 2011

Если используется два дополнения (обычно так), отрицание - это дополнение, добавьте 1:

-x == ~x + 1

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

1 голос
/ 28 августа 2011

Отрицание - это оператор сам по себе, унарный оператор -. Использовать это так же быстро, как использовать побитовые операции, и сэкономить вам много печатать.

negativeX = -positiveX; // is the same as (~positiveX) + 1

Умножение не производится.

Если вам нужна скорость, и вы не знаете, является ли число отрицательным или положительным, троичный оператор ?: быстрее, чем вводит служебный вызов Math.abs().

positiveX = unknownX < 0 ? -unknownX : unknownX;
0 голосов
/ 01 июля 2019

В основном цифры 2 'дополняют число в противоположном знаке.

if (num < 0) {
   PosNum = ~num + 1;
}
else {
   NegNum = ~num + 1;
}
0 голосов
/ 15 апреля 2013

Попробуйте это:

var number:Number = 10;
//Makes a number
trace(number)
//Tells you the number BEFORE converting
number = number - number * 2;
//Converts number
// Takes number times 2 and subtracts it from original number
trace(number);
//Tells you the number AFTER converting

В конце концов, все, что вам нужно, это:

var number:Number = 10;
number = number - number * 2;
...