2010-03-24 19 views
5

Ben kodu koşuyorum bazen bu verir:C#: Shift sol atama operatörü davranış

UInt32 current; 
int left, right; 

... 

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

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

Herhangi değeri> = 32, 32 kaydırılır tek değer% görünür. Çerçevede meydana gelen bazı "optimizasyon" var mı?

+1

Sorun açık değil. 'UInt32' 32 değer bite sahiptir. 32 bitten sola kaydırırsanız, tüm bitleri sıfırlarsınız (çünkü tüm değer bitlerini "uzaklaştırdınız"). Eğer daha fazla değiştirirseniz, yine de tüm bitleri sıfırlarsınız, böylece efekt tam olarak aynıdır. Ne bekliyordun? –

+0

Bu bir optimizasyon değil; Bu, operatörün nasıl çalışması için tanımlandığıdır. – Gabe

cevap

6

C# 3.0 dil özellikleri, 7.8 "Vites operatörleri" aşağıdaki gibi önceden tanımlanmış operatörler için

, kaydırmaya bitlerin sayısı hesaplanır: x türü int

  • olduğunda veya uint, kayma sayısı, düşük sıralı beş bit sayımı ile verilir. Başka bir deyişle, kayma sayısı & 0x1F sayısından hesaplanır.
  • x tipi uzun veya ulong olduğunda, kaydırma sayısı, düşük sıra altı bit sayısıyla verilir. Başka bir deyişle, kayma sayısı & 0x3F sayısından hesaplanır.