2009-12-10 8 views

Respuesta

28

En C#, puede utilizar los tipos de enteros sin signo, y luego el << y >> hacer lo que usted espera. El MSDN documentation on shift operators le da los detalles.

Dado que Java no admite enteros sin signo (aparte de char), este operador adicional se hizo necesario.

+0

Gracias por la entrada – Nikolaos

11

Java no tiene un desplazamiento a la izquierda sin signo (<<<), pero de cualquier manera, puede simplemente convertir a uint y shfit desde allí.

E.g.

(int)((uint)foo >> 2); // temporarily cast to uint, shift, then cast back to int 
+0

Java no? o C# no? – Will

+1

C# no tiene ningún operador de 'cambio sin signo'. Java tiene un desplazamiento DERECHO sin signo, pero no un cambio IZQUIERDO sin signo. – Matt

+0

+1 Gracias por su aporte sobre esto. Lo tendré en cuenta cuando me obliguen a usar tipos firmados. – Nikolaos

2

Al leer esto, espero que mi conclusión de uso de la siguiente manera sea correcta. De lo contrario, las ideas se agradecieron.

Java

i >>>= 1; 

C#:

i = (int)((uint)i >> 1); 
1

n >>> s en Java es equivalente a TripleShift (n, s) donde:

private static long TripleShift(long n, int s) 
    { 
     if (n >= 0) 
      return n >> s; 
     return (n >> s) + (2 << ~s); 
    } 
+0

'(2 << ~ s)' no funcionará ... – Lucero

+0

funciona para vb.net especialmente –

0

Por mi VB .Net personas

Las respuestas sugeridas anteriormente darán desbordar excepciones con Option Strict ON

Prueba esto, por ejemplo, -100 >>> 2 con soluciones anteriores:

El código siguiente funciona siempre para >>>

Function RShift3(ByVal a As Long, ByVal n As Integer) As Long 
     If a >= 0 Then 
      Return a >> n 
     Else 
      Return (a >> n) + (2 << (Not n)) 
     End If 
End Function 
+0

@Sebastien Lebreton no había visto su solución antes de publicar este –

0

No hay >>> operador en C#. Pero puede convertir su valor como int, long, Int16, Int32, Int64 en unsigned uint, ulong, UInt16, UInt32, UInt64 etc.

Aquí está el ejemplo.

private long getUnsignedRightShift(long value,int s) 
    { 
     return (long)((ulong)value >> s); 
    } 
Cuestiones relacionadas