Es allí una manera de llevar a cabo una circular de desplazamiento de bits en C#?
-
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.
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.
Tengo que admitir que me acabo de hacer una búsqueda de "C# de bits de rotar" y encontró un enlace a una página con una clase de Java que podría ser fácilmente adaptado a C#
También he encontrado esto en Google Libro que es una función de C++, con un comportamiento similar
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.