A2A. Usted pregunta: ¿Cuál será el algoritmo de rotación correcto en C?
Si por “giro a la derecha” realmente quiere decir el desplazamiento circular a la derecha de los bits de un entero sin signo, es bastante sencillo implementarlo en C en términos de desplazamiento a la derecha , desplazamiento a la izquierda, Y bit a bit y OR, una vez que sepa cuántos bits ese entero sin signo es ancho .
#include
…
- ¿Es mejor hacer InterviewBit ahora (actualmente estoy en mi quinto semestre) o hacer SPOJ ahora y luego hacer InterviewBit solo 3 o 4 meses antes de las entrevistas? Solo conozco algunas estructuras de datos y algoritmos básicos. He hecho 40 problemas en SPOJ.
- Cómo convertir de binario a decimal
- ¿Cuál es la mejor prueba de primalidad que garantiza un resultado 100% exacto pero que se puede hacer en un tiempo polinómico?
- ¿Cuáles son algunos algoritmos clásicos de programación dinámica unidimensional?
- ¿Cuál sería el mejor algoritmo para generar números aleatorios únicos para cupones de recarga?
uint32_t ror32 (valor uint32_t) {
retorno ((valor & 1) <> 1);
}
El “algoritmo” para el caso simple de un desplazamiento circular a la derecha de 1 bit (realmente, solo una expresión) es bastante sencillo:
- tome el bit menos significativo con
(value & 1)
y muévalo a la izquierda con( … << 31)
para que se convierta en el bit más significativo para ese tamaño entero; - desplazar a la derecha el valor en una posición con
(value >> 1)
descartando así el bit menos significativo; - hacer un OR booleano de los valores obtenidos en los puntos anteriores;
Los casos en los que desea realizar un desplazamiento circular a la derecha de más de 1 bit a la vez son un poco más complicados, pero la idea general es la misma: tome el menor count
bits significativos, muévalos a la izquierda por size - count
y haga un poco o con los bits más significativos desplazados a la derecha por count
.
Algunas arquitecturas proporcionan una sola instrucción de lenguaje de máquina para eso (ver, por ejemplo, ROR
en ARM y x86), pero no hay forma de usarlas directamente desde C de forma portátil.
Por otro lado, parece que muchos compiladores “detectarán” lo que realmente quieres hacer y usarán las instrucciones apropiadas del lenguaje de máquina si hay alguna.