2009-12-10 34 views

Trả lời

28

Trong C#, bạn có thể sử dụng các loại unsigned integer, và sau đó là <<>> làm những gì bạn mong đợi. Các MSDN documentation on shift operators cung cấp cho bạn các chi tiết.

Vì Java không hỗ trợ số nguyên không dấu (ngoài char), toán tử bổ sung này trở nên cần thiết.

+0

cảm ơn tuyệt vời cho đầu vào – Nikolaos

11

Java không có phím tắt trái (<<<), nhưng dù bằng cách nào, bạn chỉ có thể truyền tới uint và shfit từ đó.

Ví dụ:

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

Java không? hoặc C# không? – Will

+1

C# không có bất kỳ toán tử 'thay đổi dấu' nào. Java có một sự thay đổi RIGHT không dấu, nhưng không phải là một sự thay đổi LEFT chưa ký. – Matt

+0

+1 Cảm ơn bạn đã nhập thông tin này. Sẽ ghi nhớ điều đó khi tôi buộc phải sử dụng các loại đã ký. – Nikolaos

2

Khi đọc bài viết này, tôi hy vọng kết luận của tôi về cách sử dụng như sau là chính xác. Nếu không, thông tin chi tiết được đánh giá cao.

Java

i >>>= 1; 

C#:

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

n >>> s trong Java là tương đương với TripleShift (n, s) nơi:

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

'(2 << ~ s)' sẽ không hoạt động ... – Lucero

+0

nó hoạt động cho vb.net đặc biệt là –

0

Đối VB của tôi .Net folks

Những câu trả lời gợi ý trên sẽ cung cấp cho bạn tràn ngoại lệ với Option Strict ON

Hãy thử điều này ví dụ -100 >>> 2 với các giải pháp trên:

Các mã sau đây làm việc luôn cho >>>

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 tôi đã không nhìn thấy giải pháp của bạn trước khi đăng bài này –

0

Không có >>> toán tử trong C#. Nhưng bạn có thể chuyển đổi giá trị của mình như int, long, Int16, Int32, Int64 thành uint, ulong, UInt16, UInt32, UInt64, v.v.

Đây là ví dụ.

private long getUnsignedRightShift(long value,int s) 
    { 
     return (long)((ulong)value >> s); 
    } 
Các vấn đề liên quan