我可以在Actionscript 3中使用按位操作将负数转为正数吗?

时间:2011-07-16 18:21:47

标签: actionscript-3 bitwise-operators

如何使用Actionscript 3中的按位运算将负数转为正数?我只是觉得我在某个地方读到过比使用Math.abs()或乘以-1更快更有可能。或者我错了,经过一天的学习字节和按位操作后,这是一个梦想?

我看到的是按位NOT几乎可以解决问题:

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

如果有人发现这个问题且感兴趣 - 在500万次迭代~(x) + 1Math.abs(x)快50%。

6 个答案:

答案 0 :(得分:14)

您需要在按位否定后添加一个。这是two's complement number system的属性。它与Actionscript无关(除了所谓的性能差异)。

所以,(~(-450)+1)给出450
(~(450)+1)提供-450

正如评论中所述,这个答案是针对这个问题而写的,用以解决问题者实验中的一个小问题。这个答案并不是对这种通用软件开发使用技术的认可。

答案 1 :(得分:9)

使用

的规则
~(x) = (-x)-1

答案 2 :(得分:4)

如果使用二补码(通常是这种情况),则否定补语然后加1:

-x == ~x + 1

它是否更快取决于编译器执行的优化。如有疑问,请测试。

答案 3 :(得分:1)

否定本身就是一个运算符,一元-运算符。使用它与使用按位操作一样快,并为您节省大量输入。

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

不执行乘法。

如果需要速度,并且您不知道数字是负数还是正数,则三元运算符?:比引入Math.abs()的函数调用开销更快。

positiveX = unknownX < 0 ? -unknownX : unknownX;

答案 4 :(得分:0)

基本数字2'的补码是相反符号的数字。

if (num < 0) {
   PosNum = ~num + 1;
}
else {
   NegNum = ~num + 1;
}

答案 5 :(得分:-2)

试试这个:

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;