2009-12-10 5 views

Odpowiedz

28

W języku C#, można używać niepodpisanych typów całkowitych, a następnie << i >> robić to, czego oczekują. MSDN documentation on shift operators podaje szczegóły.

Ponieważ Java nie obsługuje liczb całkowitych bez znaku (z wyjątkiem char), ten dodatkowy operator stał się niezbędny.

+0

wielkie dzięki za wejście – Nikolaos

11

Java nie ma niepodpisany lewy shift (<<<), ale tak czy inaczej, można po prostu oddanych do uint i shfit stamtąd.

E.g.

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

Java nie? lub C# nie? – Will

+1

C# nie ma żadnych operatorów 'unsigned shift'. Java ma niepodpisane przesunięcie w prawo, ale nie niepodpisane przesunięcie w lewo. – Matt

+0

+1 Dziękuję za twój wkład w tej sprawie. Będzie o tym pamiętać, gdy będę zmuszony używać podpisanych typów. – Nikolaos

2

Po przeczytaniu tego, mam nadzieję, że moja konkluzja użycia jest poprawna. Jeśli nie, wgląd został doceniony.

Java

i >>>= 1; 

C#

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

n >>> s Java odpowiada TripleShift (n, y), gdzie:

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

'(2 << s)' nie zadziała ... – Lucero

+0

działa dla vb.net szczególnie –

0

Ze swej VB .Net ludzie

Sugerowane odpowiedzi powyżej da Ci przelewać wyjątki z Option Strict ON

Spróbuj na przykład -100 >>> 2 z powyższych rozwiązań:

Poniższy kod działa zawsze na >>>

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 Nie widziałem twojego rozwiązania przed opublikowaniem tego –

0

Nie ma >>> operator w języku C#. Ale możesz przekonwertować swoją wartość, np. Int, long, Int16, Int32, Int64 na unsigned uint, ulong, UInt16, UInt32, UInt64 itd.

Oto przykład.

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