2011-07-19 84 views
5

相當於我寫這以下三種功能爲我的項目的工作:什麼是無符號長的在Java

WORD shuffling(WORD x) 
{ 

// WORD - 4 bytes - 32 bits 

//given input - a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15- b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15 

//output required - a0,b0,a1,b1,a2,b2,a3,b3,a4,b4,a5,b5,a6,b6,a7,b7 - a8,b8,a9,b9,a10,b10,a11,b11,a12,b12,a13,b13,a14,b14,a15,b15 

    x = (x & 0X0000FF00) << 8 | (x >> 8) & 0X0000FF00 | x & 0XFF0000FF; 
    x = (x & 0X00F000F0) << 4 | (x >> 4) & 0X00F000F0 | x & 0XF00FF00F; 
    x = (x & 0X0C0C0C0C) << 2 | (x >> 2) & 0X0C0C0C0C | x & 0XC3C3C3C3; 
    x = (x & 0X22222222) << 1 | (x >> 1) & 0X22222222 | x & 0X99999999; 
    return x; 
} 

WORD t_function(WORD n) 
{ 

    WORD t_result=0; 
    WORD64 var = 2*((n*n)& 0xFFFFFFFF)+n; // (n*n mod FFFFFFFF) becomes a 32-bit word 
    t_result = (WORD) ((var)& 0xFFFFFFFF); 
    return t_result; 
} 

WORD lfsr(WORD t_result) 
{ 

    WORD returnValue = t_result; 
    WORD flag = 0; 
    flag = returnValue & 0x80000000; // Checking if MSB is 1 or 0 

    // Left shift the input 
    returnValue = returnValue << 1; 

    // If MSB is 1 then XOR the reult with the primitive polynomial 
    if(flag > 0) 
    { 
     returnValue = returnValue^0x4C11DB7; 
    } 
    return returnValue; 
} 

WORD - 無符號長

這個代碼是在「C」。現在我必須在java中實現這個。編譯和運行代碼時一切都很好。但在這裏我用unsigned long和在java中我已經使用int因爲我一次在32位操作。問題是「當在java中執行時,如果結果超出了int範圍,輸出會發生偏差,並且它不會是c代碼中的相同輸出。是否有解決我的問題的方法來替換無符號長範圍值在Java中

+0

它在哪裏「超出範圍」? –

+0

來自lfsr函數的結果超出了int – Pramod

回答

9

簡短的回答,有沒有在java中的無符號的數據類型。長在C是32位32位系統,但是java的long是64位的,所以你可以使用它來替換(至少它可以解決溢出問題)如果你需要更寬的整數,使用BigInteger類。

4

查看Java的Primitive Data Types。如果你需要的東西比長更大,嘗試BigInteger

+3

的範圍爲什麼當它給出與其他答案相同的信息時,這會降低效果? –

17

更新 - Java的8具有無符號int & long

最初在Java中,原始整數數據類型(字節,短,int和long)簽署(正或負)。

現在我在Java Tutorial中看到,從Java SE 8開始,intlong都可以作爲無符號使用。

INT:默認情況下,int數據類型是一個32位有符號的2的補碼整數,其具有最小值-2³¹和2³¹-1的最大值。在Java SE 8和更高版本中,可以使用int數據類型來表示無符號的32位整數,其最小值爲0,最大值爲2³²-1。使用Integer類將int數據類型用作無符號整數。有關更多信息,請參閱數字類部分。像compareUnsigned,divideUnsigned等靜態方法已被添加到Integer class以支持無符號整數的算術運算。

long:長數據類型是一個64位二進制補碼整數。有符號長度的最小值爲-2⁶³,最大值爲2⁶³-1。在Java SE 8和更高版本中,可以使用長數據類型來表示一個無符號的64位長,它的最小值爲0,最大值爲2⁶4 -1。無符號long的最小值爲0,最大值爲2⁶4 -1。當您需要的值範圍比int提供的範圍寬時,使用此數據類型。 Long class還包含像compareUnsigned,divideUnsigned等方法來支持無符號long的算術運算。

一定推薦這種做法。我只是讓你意識到這個選擇。