如何使用Actionscript 3中的按位运算将负数转为正数?我只是觉得我在某个地方读到过比使用Math.abs()
或乘以-1
更快更有可能。或者我错了,经过一天的学习字节和按位操作后,这是一个梦想?
我看到的是按位NOT
几乎可以解决问题:
// outputs: 449
trace( ~(-450) );
如果有人发现这个问题且感兴趣 - 在500万次迭代~(x) + 1
比Math.abs(x)
快50%。
答案 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;