2011-04-30 33 views
22

Me pregunto cómo implementar un circular desplazamiento a la derecha por k de la cadena de bits que representan los bits de int.Java - desplazamiento circular usando operaciones bit a bit

public int rtCircShift(int bits, int k) 
{ 
    return bits >> k; 
} 

Todo esto se hace de código de retorno 0 , ¿cómo puedo hacer que un desplazamiento circular?

Respuesta

26

Esto debería funcionar:

return (bits >>> k) | (bits << (Integer.SIZE - k)); 

también ver la Wikipedia article on circular shifts.

+0

convirtió el 'o' lógico en un bitwise. – Femaref

+0

Eso es todo, gracias. – john

+4

Todavía no es correcto, debe usar el desplazamiento lógico a la derecha, '>>>'. Pegue esto en un método y tiene 'Integer.rotateRight'. – rlibby

29

¿Quiere decir que quiere que los bits girados del lado derecho aparezcan a la izquierda?

return Integer.rotateRight(bits, k); 

Ejemplo:

int n = 0x55005500; // Binary 01010101000000000101010100000000 
int k = 13; 
System.err.printf("%08x%n", Integer.rotateRight(n, k)); 

salida:

a802a802 // Binary 10101000000000101010100000000010 
7

The answer por schnaader es correcta:

return (bits >>> k) | (bits << (32-k)); 
  1. la f parte rimero (bits >>> k) derecha desplaza el valor almacenado en bits por k bits de y 'la tercera >' asegura que el bit más a la izquierda es un cero en lugar de la señal de la bits
  2. la segunda parte (bits << (32-k)) izquierda desplaza el valor en bits por k número de bits -complement

Ahora, tiene dos variables temporales donde se almacenan los primeros (32 k) bits de los bits de la derecha de la var (1), y se almacenan los últimos k bits en el extremo izquierdo bits de var (2). La operación bit a bit o simplemente opera estas dos variables juntas (observe el uso de >>> en lugar de >>) y tiene el desplazamiento circular.

0
int x=12345,n=5; 
System.out.println((x%10)*Math.pow(10, n-1)+(x/10)); 

Para cambiar por un bit.

0

Esto debe hacerlo:

/** 
* Rotate v right with k steps 
*/ 
public static int rro(int v, int k) { 
    return (v >>> (k%32)) | (v << ((k%32)-32) 
} 

/** 
* Rotate v left with k steps 
*/ 
public static int lro(int v, int k) { 
    return (v << (k%32)) | (v >>> ((k%32)-32) 
} 

creo que las otras respuestas son incorrectas, ya que si usted cambia más de 32 posiciones, sus algoritmos fallan. Si desea tipos de datos más grandes, necesita ajustar los tipos de datos y el '32' en todos los lugares.

Cuestiones relacionadas