variable rotacion manipulacion ejemplos desplazamiento corrimiento binaria c# bit-manipulation

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.



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))); }