2013-11-24 41 views
3
var rgba = 0xFFFFFFFF; 
console.log((rgba&0xFF000000)>>24); 

上面的代碼片段顯示-1而不是255,這沒有任何意義。我知道JS數字是float64,因此你不能期望在某個點以上的精確二進制操作,但是這個點如此之低,你不能代表一個單一數字的RGBA通道?爲什麼JavaScript呈現按位操作的怪異行爲?

+6

簽署/未簽名的問題。我認爲使用「>>>」運算符沒有簽名。 –

+0

@MarvinSmit:確實:'0xFF000000 >>> 24 === 255' –

+0

哦,有趣的是,謝謝。我可以在不破壞精度的情況下將數據存儲在單個數據中的大小限制是多少? (我剛剛測試0xFF000000 >>> 32),它不工作!) – MaiaVictor

回答

2

這實際上不是一個精確問題。

在javascript按位運算符將其參數轉換爲32位有符號值。在32位有符號形式& ff000000是一個負數,所以當你移位它時,左邊的位是1而不是0(這是爲了確保在移位後twos complement negative number保持負值)。你仍然可以通過按位移後的0xff 得到你想要的行爲,在之後,如果你拉出不同的顏色分量,可能是最好的辦法。

var rgba = 0xFFFFFFFF; 
console.log((rgba>>24)&0xff); 

var red = (rgba>>24) & 0xff; 
var green = (rgba>>16) & 0xff; 
var blue = (rgba>>8) & 0xff; 
var alpha = rgba & 0xff; 

馬文斯密特上面提到,>>>是無符號的右移總是拉動0,所以在這種特殊情況下,你可以使用了。 Wikipedia describes them爲'算術'和'邏輯'右移。