2011-07-19 15 views
5

he escrito estas tres funciones siguientes para mi proyecto para trabajar:¿Cuál es el equivalente de largo sin signo en 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; 
} 

PALABRA - unsigned long

este código se encuentra en "C". Ahora tengo que implementar esto en Java. Todo está bien para compilar y ejecutar el código. Pero aquí he usado unsigned long y en java he usado int. Ya que estoy operando en 32bits a la vez. El problema es "cuando se implementa en Java cada vez que el resultado está fuera del rango de int, la salida se desvía y no será el mismo resultado del código C. ¿Hay alguna solución para mi problema para reemplazar los valores de largo alcance sin firmar? en Java

+0

¿Dónde está "fuera de rango"? –

+0

el resultado que proviene de la función lfsr está saliendo del rango de int – Pramod

Respuesta

9

respuesta corta, no hay tipo de datos sin firmar en Java. de largo en C es de 32 bits en 32 bits sistemas, pero el de java es de 64 bits, por lo que puede usarlo para reemplazarlo (al menos resolvería el problema de desbordamiento). Si necesita enteros aún más amplios, use la clase BigInteger.

4

Mire sobre Java de Primitive Data Types. Si necesita algo más grande que un largo, trate de un BigInteger.

+3

¿Por qué se baja la votación cuando da la misma información que la otra respuesta? –

17

Actualización - Java 8 tiene sin firmar int & long

originalmente en Java, se firmaron los tipos de datos enteros primitiva (byte, short, int y long) (positivo o negativo).

Ahora veo en el Java Tutorial que a partir de Java SE 8, ambos int y long se pueden utilizar como unsigned.

int: Por defecto, el tipo de datos int es un 32-bit entero con signo de complemento a dos, que tiene un valor mínimo de -2³¹ y un valor máximo de 2³¹-1. En Java SE 8 y posterior, puede usar el tipo de datos int para representar un entero de 32 bits sin signo, que tiene un valor mínimo de 0 y un valor máximo de 2³²-1. Utilice la clase Integer para usar el tipo de datos int como un entero sin signo. Vea la sección The Number Classes para más información. Se han agregado métodos estáticos como compareUnsigned, divideUnsigned, etc. al Integer class para admitir las operaciones aritméticas para enteros sin signo.

long: El tipo de datos largo es un entero de complemento de dos de 64 bits. El largo firmado tiene un valor mínimo de -2⁶³ y un valor máximo de 2⁶³-1. En Java SE 8 y posterior, puede usar el tipo de datos largos para representar un largo sin signo de 64 bits, que tiene un valor mínimo de 0 y un valor máximo de 2⁶⁴-1. La longitud sin signo tiene un valor mínimo de 0 y un valor máximo de 2⁶⁴-1. Utilice este tipo de datos cuando necesite un rango de valores más amplio que los provistos por int. El Long class también contiene métodos como compareUnsigned, divideUnsigned etc. para admitir operaciones aritméticas para unsigned long.

Soy no necesariamente recomendar este enfoque. Simplemente estoy haciéndote consciente de la opción.

Cuestiones relacionadas