[英]What is the different of bitwise operation between javascript and java
[英]Bitwise operation OR on (double) in Java not possible, possible in JavaScript
這是Google Chrome Javascript控制台的輸出。
這是DrJava Java控制台的輸出。
我的Javascript代碼是
(baseCPUCyclesPerIteration - CPUCyclesTotalRoundoff) | 0
如果兩個變量都是整數,則似乎可以在Java中很好地編譯,但顯然在javascript中它們是雙精度型。 即使
typeof baseCPUCyclesPerIteration
顯示"number"
結果使它很明顯是雙重數據類型。 我不明白為什么按位OR 0
可以在Java語言的double中工作,但不能在Java double上工作。
似乎目的| 0
| 0
只是修剪double數據類型中的小數點。 我猜在Java中等效的將是(int)
或(long)
強制轉換正確嗎? 或按位| 0
| 0
不只是在javascript中修整小數點嗎?
編輯:ya | 0
| 0
不僅在javascript中修剪,還運行了它。 8899811111.111113453456754645 | 0
8899811111.111113453456754645 | 0
回來了309876519
。
(盡管我通過了雙精度限制,但大聲笑仍然嘗試在javascript中進行計算,但我猜這是溢出發生的地方)。
在javascript中,所有按位運算符都將十進制數字轉換為32位整數。 對於正數,它的作用就像floor
;對於負數,它的作用就像ceil
。 諸如|0
或~~
類的東西通常用作在JavaScript中將數字轉換為整數的技巧。
為了解釋您看到的溢出,我們可以查看有關Javascript如何將數字轉換為int32的規范: http : //es5.github.io/#x9.5
抽象運算ToInt32將其參數轉換為2 ^ 31到2 ^ 31-1(含)范圍內的2 ^ 32整數值之一。 此抽象操作的功能如下:
- 令number為在輸入參數上調用ToNumber的結果。
- 如果number為NaN,+ 0,-0,+∞或-∞,則返回+0。
- 令posInt為sign(number)* floor(abs(number))。
- 設int32bit為posInt模2 ^ 32; 也就是說,Number類型的有限整數值k具有正號並且大小小於2 ^ 32,因此posInt和k的數學差為2 ^ 32的整數倍。
- 如果int32bit大於或等於2 ^ 31,則返回int32bit -2 ^ 32,否則返回int32bit 。
因此,要重現此行為,您將必須重現此邏輯。
編輯:這是Mozilla的Rhino引擎在Java中的工作方式:(根據user3435580提供的github鏈接)
public static int toInt32(double d) {
int id = (int)d;
if (id == d) {
// This covers -0.0 as well
return id;
}
if (d != d
|| d == Double.POSITIVE_INFINITY
|| d == Double.NEGATIVE_INFINITY)
{
return 0;
}
d = (d >= 0) ? Math.floor(d) : Math.ceil(d);
double two32 = 4294967296.0;
d = Math.IEEEremainder(d, two32);
// (double)(long)d == d should hold here
long l = (long)d;
// returning (int)d does not work as d can be outside int range
// but the result must always be 32 lower bits of l
return (int)l;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.