2011-07-16 56 views
5

有沒有一種直接的方法如何在ActionScript3中使用按位運算將負數轉爲正數?我只是覺得我已經在某個地方讀過,它比使用Math.abs()或乘以-1更快。還是我錯了,這是一天後學習字節和位運算的夢想?在Actionscript 3中,是否可以將負數轉爲正數?

我所看到的是,按位NOT差不多的伎倆:

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

如果有人發現這個問題,並有興趣 - 在500萬次迭代~(x) + 1Math.abs(x)快50%。

+0

ABS是不一樣的NOT + 1,ABS unsigns,NOT + 1,通過則無效。所以如果你傳遞一個正數,你會得到不同的結果。 – ekerner

回答

12

你需要採取的按位取反後添加一個規則。這是two's complement number system的財產。它與Actionscript無關(除了所謂的性能差異外)。

所以,(~(-450)+1)450
(~(450)+1)-450

正如評論中指出的,這個答案是針對這個問題編寫的,以解決問題提問者實驗中的一個小問題。這個答案不是對一般軟件開發使用這種技術的認可。

+0

謝謝你的鏈接,不知道這樣的「二補號」的事情。 – Rihards

+0

@rwong只是好奇;是BitWise更好的性能比「number =(number <0?-numbe r:number);「在這個否定的情況下 –

+1

儘管如此,系統中最小的整數不能像這樣變成正數,+1會導致整數溢出。 –

9

使用,上面寫着

~(x) = (-x)-1 
+0

不用說,簡單的代數可以讓你找到你想要的公式,即'-x =〜x + 1',但是一個好的方面是,這個技巧只適用於純整數,對於最小的整數,稱之爲'z',因爲整數用所謂的「二進制補碼」表示,所以實際上你自己回到了'z'。「 –

+0

BitWise比」number =(number <0?number:number);「在這個否定的情況下更好? –

+0

表達式'number =(number < 0?-number:number)'計算絕對值,而'number =〜number + 1'取值爲一個值,它們是兩種不同的操作。就像你有可能導致[分支預測失敗](http://stackoverflow.com/questions/11227809/why-is-processing-a-sorted-array-faster-than-an-unsorted-array)和那裏爲什麼要比較呢?這是兩種不同的操作。 –

4

如果使用的是兩補(通常情況下),否定是補充再加入1:

-x == ~x + 1 

無論它的速度更快取決於什麼的優化編譯器執行。如有疑問,請測試。

+0

對於測試建議+1以及關於這是如何依賴編譯器的評論。 –

1

否定是一個運營商所有自己,一元運算符-。使用它與使用按位操作一樣快,併爲您節省大量輸入。

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

不執行乘法。

如果速度是您的需要,並且您不知道該數字是負數還是正數,則三元運算符?:比引入Math.abs()的函數調用開銷更快。

positiveX = unknownX < 0 ? -unknownX : unknownX; 
-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; 
相關問題