Es allí una manera de llevar a cabo una circular de desplazamiento de bits en C#?

StackOverflow https://stackoverflow.com/questions/35167

  •  09-06-2019
  •  | 
  •  

Pregunta

Sé que lo siguiente es verdadero

int i = 17; //binary 10001
int j = i << 1; //decimal 34, binary 100010

Pero, si usted cambia demasiado lejos, los bits cae en la final.Cuando esto sucede es un asunto del tamaño de entero que está trabajando.

Es allí una manera de realizar un cambio de modo que los bits girar en torno al otro lado?Estoy buscando una sola operación, no de un bucle for.

¿Fue útil?

Solución

Si usted sabe el tamaño de tipo, se podría hacer algo como:

uint i = 17;
uint j = i << 1 | i >> 31;

...que llevaría a cabo una circular a cambio de un valor de 32 bits.

Como una generalización de la circular desplazamiento a la izquierda de n bits, en un b bits variable:

/*some unsigned numeric type*/ input = 17;
var result = input  << n | input  >> (b - n);


@El comentario, parece que C# no tratar el bit alto de los valores con signo diferente.He encontrado algo de información sobre este aquí.También he cambiado el ejemplo, para utilizar un valor de este tipo.

Otros consejos

Hace un año que la tengo que aplicar MD4 para mi tesis de licenciatura.Aquí está mi aplicación de la circular de desplazamiento de bits usando un UInt32.

private UInt32 RotateLeft(UInt32 x, Byte n)
{
      return UInt32((x << n) | (x >> (32 - n)));
}

Sólo como referencia sobre cómo hacerlo, este dos funciones funcionan perfectamente para la rotación de las palas de 1/2word:

static public uint ShiftRight(uint z_value, int z_shift)
{
    return ((z_value >> z_shift) | (z_value << (16 - z_shift))) & 0x0000FFFF;
}

static public uint ShiftLeft(uint z_value, int z_shift)
{
    return ((z_value << z_shift) | (z_value >> (16 - z_shift))) & 0x0000FFFF;
}

Sería fácil extender para cualquier tamaño.

La aplicación más famosa es la solución para el problema de Josefo (como se discutió en Concreto de las Matemáticas, ver http://oeis.org/A006257).Esto es, básicamente, un enigma sin aplicaciones evidentes.En este video, He demostrado conexiones entre el segundo fin de Josefo problema y equilibrada completa de los árboles.Todavía no es una aplicación, pero moviéndose ligeramente en la dirección correcta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top