2012-02-26 57 views
1

我想在JavaScript中減去兩個帶符號8位整數。由於JavaScript沒有「簽名」或「無符號」整數類型,我需要堅持'數字'類型 - 並且不能像使用不同語言一樣使用「投射魔法」。在JavaScript中減去帶符號整數

我想模擬一種CPU寄存器,因此需要處理簽名爲無符號值。此外,我需要計算進位和溢出標誌的值。當有符號溢出(值不是不在-128-127範圍內)溢出標誌被設置時,進位標誌被置位,當無符號的溢出發生(無符號值已經離開範圍從0到255) 。

此代碼似乎工作,但相當繁瑣和醜陋。有沒有「簡單」的方法來做這個計算?

在此先感謝!

//Convert a signed 8bit number to a "real" number (254 => -2) 
function toSigned(number) 
{ 
    if (number & 0x80) //sign bit is set 
     number = -(0x100 - number); 
    return number 
} 
//Inverts the sign of a signed 8bit number 
function invertSign(number) 
{ 
    return 0x100 - number; 
} 
//subtracts source from target 
function sub(target,source) 
{ 
    //calculate carry 
    var carry = (target - source < 0); 
    console.log("Carry: %b", carry); 

    //Calculate result & overflow 
    var result = (target + invertSign(source)) & 0xFF; 
    var overflow = !(result >= -128 && result <= 127); 
    console.log("Overflow: %b", overflow); 
    console.log("Result: %d - %d = %d",toSigned(target),toSigned(source),result); 
} 
//Examples 
sub(8,254); //8 - (-2), no overflow, carry set 
sub(8,2); //8 - 2, no overflow, no carry 
sub(0x50,0xB0); //80 - (-80), overflow, carry 
+1

你寫了8個字節的整數..你的意思是8位嗎?無論如何,如果你必須在數量上做到這一點,如果你的目標是現代瀏覽器,看看Typed Arrays可能是一個想法。即使只有一個值,它仍然有利於獲得一個值。 https://developer.mozilla.org/en/JavaScript_typed_arrays – 2012-02-26 20:38:46

+0

除了實際從'sub'返回一個結果,而不是將它們分發到控制檯(例如'toSigned'僅用於控制檯日誌記錄......),我不能看到可以在不損害可讀性的情況下對其進行合理改進的任何更改。這到底是什麼麻煩? – Hamish 2012-02-26 20:39:04

+0

@JimBlackler是的,它應該是「8位」,我只是糾正它。謝謝你的提示,這聽起來很有趣。 – muffel 2012-02-26 21:09:15

回答