2010-03-24 35 views
5

Tôi đang chạy mã mà đôi khi mang lại điều này:C#: Shift nhượng trái điều hành hành vi

UInt32 current; 
int left, right; 

... 

//sometimes left == right and no shift occurs 
current <<= (32 + left - right); 

//this works 
current <<= (32 - right); 
current <<= left; 

Có vẻ đối với bất kỳ giá trị> = 32, chỉ có giá trị% 32 được thay đổi. Có một số "tối ưu hóa" xảy ra trong khuôn khổ?

+1

Vấn đề không rõ ràng. 'UInt32' có 32 bit giá trị. Nếu bạn chuyển nó sang trái 32 bit, bạn sẽ nhận được tất cả các bit bằng không (vì bạn đã chuyển tất cả các bit giá trị "đi"). Nếu bạn thay đổi nhiều hơn, bạn sẽ vẫn nhận được tất cả các bit bằng không, do đó, hiệu ứng là chính xác như nhau. Những gì bạn đã mong đợi? –

+0

Nó không phải là một tối ưu hóa; đó chỉ là cách người vận hành được định nghĩa để làm việc. – Gabe

Trả lời

6

C# 3.0 đặc điểm kỹ thuật ngôn ngữ, 7.8 "khai thác Shift":

Đối với các nhà khai thác được xác định trước, số lượng các bit để chuyển được tính như sau:

  • Khi các loại x là int hoặc uint, số lần dịch chuyển được tính bằng số bit năm bit thấp. Nói cách khác, số lượng ca được tính từ số & 0x1F.
  • Khi loại x dài hoặc ulong, số lần dịch chuyển được tính bằng số bit sáu bit thấp. Nói cách khác, số lượng ca được tính từ số & 0x3F.