rotacion - ¿Hay alguna forma de realizar un desplazamiento circular de bits en C#?
rotacion de bits en c (5)
Sé que lo siguiente es verdad
int i = 17; //binary 10001
int j = i << 1; //decimal 34, binary 100010
Pero, si cambias demasiado lejos, los bits caen del final. Donde esto sucede es una cuestión del tamaño del número entero con el que está trabajando.
¿Hay alguna manera de realizar un cambio para que los bits giren hacia el otro lado? Estoy buscando una sola operación, no un bucle for.
Tengo que admitir, acabo de hacer una búsqueda de "C # bit rotate" y encontré un enlace a una página con una clase de Java que se adaptaría fácilmente a C #
También encontré esto en Google Book, que es una función de C ++ con un comportamiento similar
Solo como referencia sobre cómo hacerlo, estas dos funciones funcionan perfectamente para rotar los bits 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 extenderlo para cualquier tamaño dado.
La aplicación más famosa es la solución al problema de Josefo (como se discutió en Concrete Mathematics, ver http://oeis.org/A006257 ). Esto es básicamente un rompecabezas sin aplicaciones obvias. En este video , demostré conexiones entre el problema Josephus de segundo orden y árboles completos equilibrados. Todavía no es una aplicación, sino que se mueve ligeramente en la dirección correcta.
Si conoce el tamaño del tipo, podría hacer algo como:
uint i = 17;
uint j = i << 1 | i >> 31;
... que realizaría un desplazamiento circular de un valor de 32 bits.
Como una generalización de desplazamiento circular n bits, en una variable de bit ab:
/*some unsigned numeric type*/ input = 17;
var result = input << n | input >> (b - n);
@ El comentario, parece que C # trata el alto bit de los valores firmados de manera diferente. Encontré algo de información aquí . También cambié el ejemplo para usar un uint.
Hace un año, tuve que implementar MD4 para mi tesis de pregrado. Aquí está mi implementación del cambio de bits circular usando un UInt32.
private UInt32 RotateLeft(UInt32 x, Byte n)
{
return UInt32((x << n) | (x >> (32 - n)));
}