2010-03-24 37 views
5

estoy ejecutando código que a veces produce esto:C#: Shift comportamiento operador de asignación izquierda

UInt32 current; 
int left, right; 

... 

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

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

Aparece por cualquier valor> = 32, sólo el 32% se desplaza valor. ¿Hay alguna "optimización" ocurriendo en el marco?

+1

El problema no está claro. 'UInt32' tiene 32 bits de valor. Si lo desplaza a la izquierda en 32 bits, obtendrá todos los bits cero (porque ha desplazado todos los bits de valor "de distancia"). Si cambia por más, igual obtendrá todos los bits, por lo que el efecto es exactamente el mismo. ¿Que esperabas? –

+0

No es una optimización; así es como el operador está definido para trabajar. – Gabe

Respuesta

6

C# 3.0 especificación del lenguaje, 7.8 "operadores de desplazamiento":

Para los operadores predefinidos, el número de bits a desplazar se calcula como sigue:

  • Cuando el tipo de x es int o uint, la cuenta de turno está dada por los cinco bits de bajo orden de conteo. En otras palabras, el recuento de turnos se calcula a partir del recuento & 0x1F.
  • Cuando el tipo de x es largo o largo, la cuenta de turno está dada por los seis bits de bajo orden de conteo. En otras palabras, el recuento de turnos se calcula a partir del recuento & 0x3F.
Cuestiones relacionadas