Pasar un entero de 2 a esta función y, a continuación, devolver un entero que es de 4

x = 2;
x = rotateInt('L', x, 1); 

(desplazamiento a la izquierda los bits en 1)

Ejemplo:
00000010 -> girar a la izquierda por 1 -> 00000100

pero si me pasa esto:

x = rotateInt('R', x, 3); 

volverá 64, 01000000

Aquí está el código, alguien puede corregir el error… gracias

int rotateInt(char direction, unsigned int x, int y)
{
    unsigned int mask = 0;
    int num = 0, result = 0;
    int i;

    for (i = 0; i < y; i++)
    {     
        if (direction == 'R')
        {
            if ((x & 1) == 1)     
                x = (x ^ 129);
            else    
                x = x >> 1;
        }
        else if (direction == 'L')
        {
            if ((x & 128) == 1)  
                x = (x ^ 129);   
            else
                x = x << 1;
        }
    }
result = (result ^ x);
return result;   
}
  • Considerar >> y <<, tal vez. Ahora escribe la función 🙂
  • Y a tu pregunta? Quieres saber las operaciones bit a bit? en.wikipedia.org/wiki/…
  • Usted realmente necesita para aprender a aplicar sangría al código. Hace el código mucho más legible. Además se puede trabajar más rápido y con menos errores comete.
InformationsquelleAutor Tim | 2010-10-13

6 Comentarios

  1. 4

    Así que voy a asumir que usted sabe lo que la derecha y la izquierda de los turnos. Y que conozca la diferencia entre la aritmética y la lógica turnos.

    C sólo tiene aritmética de los turnos. No es lógico turnos, ni hacer gira. bueno me mintió, C ¿lógicos cambios en unsigned int.

    De giro no, bueno, exactamente eso: es el mismo como un cambio lógico, excepto cuando cambie pasado el final de la serie, los dígitos «wrap around» para el otro lado. Por ejemplo

    0010 haga girar es 0001. Si usted se haga girar de nuevo, consigue 1000. A ver, el 1 envuelto alrededor, o girar para el otro lado del entero.

    La izquierda rotar es similar: 0100 a la izquierda girar 1000 a la izquierda girar 0001 a la izquierda girar 0010 etc.

    Nota que gira no mantener el bit de signo como un desplazamiento aritmético a la derecha haría.

    Así, C sólo tiene aritmética de los turnos. Así que usted tiene que poner en práctica la «rotar» parte de forma manual. Por lo tanto, a la izquierda-girar. Usted quiere:

    1. Capturar el valor de la izquierda-la mayoría de los bits. (es un 0 o un 1?)
    2. Hacer un desplazamiento de izquierda
    3. Conjunto de más a la derecha de bits que es la parte que hemos hablado en el paso 1 (el cual necesita ser girado alrededor) con el valor correcto, basado en lo que hemos capturado desde el paso 1.

    Usted debe ser capaz de averiguar un método similar para la derecha, gira.

    buena suerte!

    • ok, voy a intentar los pasos, gracias 🙂
    • puede comprobar el código de mí?
    • Siento ser contrario; y si el derecho a cambiar de firmada la cantidad es aritmética o lógica es la del individuo compilador de C — la norma ISO explícitamente deja indefinido. Que acaba de ser pedante, aunque, sólo se adhieren a los valores sin signo.
    • Ideal para la rotación de 1, pero ¿qué hay de la rotación de n?
  2. 3

    La aceptada respuesta es muy agradable y sencillo.

    Sin embargo, yo estaba haciendo un poco de K&R ejercicios para refrescar mi C, y quería compartir este gire a la derecha de la función que puede resultar muy útil para personas que están tratando de aprender bit a bit de las operaciones.

    unsigned int rightRotateBits(unsigned int inputWord, int numberOfBitsToRotate) {
        int bitWidth = sizeof(inputWord) * 8;
        //Rotating 32 bits on a 32-bit integer is the same as rotating 0 bits;
        //  33 bits -> 1 bit; etc.
        numberOfBitsToRotate = numberOfBitsToRotate % bitWidth;
    
        unsigned int tempWord = inputWord;
    
        //Rotate input to the right
        inputWord = inputWord >> numberOfBitsToRotate;
    
        //Build mask for carried over bits
        tempWord = tempWord << (bitWidth - numberOfBitsToRotate);
    
        return inputWord | tempWord;
    }

    Para la izquierda-rotaciones acaba de pasar valores entre -1 y -31 a la bitAmount argumento.

    Hacer notar que esta función favorece la enseñabilidad/legibilidad y simplicidad sobre la eficiencia/portabilidad/compacidad.

    • También, si desea visualizar sus resultados, usted puede utilizar esta buena función que imprime el bit componentes de una palabra a la consola: stackoverflow.com/a/1024414/269753
    • Tenga en cuenta que esto puede hacerse un poco más genérico (pass en uint64_t etc), mediante la definición de bit_width = sizeof(inputWord) * 8;
    • Gracias, ese es un buen punto. He actualizado el código.
  3. 0

    Parece que tu gire a la derecha es la DERECHA. 1 cayó de lado y regresó de nuevo desde la izquierda?

    De todos modos, aquí están los ingredientes:

    http://tigcc.ticalc.org/doc/keywords.html#if – para determinar si es ‘L’ o ‘R’

    http://tigcc.ticalc.org/doc/keywords.html#for – para contar el número de veces a cambio de

    y

    http://msdn.microsoft.com/en-us/library/f96c63ed(VS.80).aspx – para cambiar

    Ir, jugar con él. Se trabajará con el tiempo!

  4. 0

    Ya que nadie le dijo cómo implementar esto, usted puede utilizar las características intrínsecas, para visual studio que son _rotl, _rotl64, _rotr, _rotr64.

    Oh, pero rotación y turnos son 2 cosas diferentes!

  5. -1

    Recomiendo el uso de un unsigned int.

    #define DIR_LEFT 0
    #define DIR_RIGHT 1
    
    unsigned int rotateInt(unsigned int in, int amount, byte dir)
    {
        return(dir == DIR_RIGHT ? (in >> amount) | ((in & ((0x01 << amount) - 1)) << (sizeof(unsigned int)*8 - amount)) : (in << amount)  | ((in & ~((sizeof(unsigned int)*8*8 - 1) >> amount)));
    }
    • Esto cambia en vez de gira.
    • Esta mejor? Puede haber optimizaciones, pero eso es todo lo que se me ocurre por ahora.
    • Lo siento tomó tanto tiempo para llegar de nuevo a usted. Sí, que mira a la derecha, pero usted no necesita la & enmascaramiento: el cambio automáticamente eliminar los bits que cae en la final. return dir == DIR_RIGHT ? (in >> amount) | (in << (8*sizeof(unsigned int) - amount)) : (in << amount) | (in >> (8*sizeof(unsigned int) - amount));

Dejar respuesta

Please enter your comment!
Please enter your name here