如何向左旋转位并向右添加旋转位

时间:2016-10-23 12:56:52

标签: c algorithm rotation bit-manipulation

我试图让我的程序工作,我将位移到左边并将移位的位添加到右边。例如00111000,如果您将其向左移动4个位置,则结果应为10000011。我怎样才能完成这项工作,我知道我需要使用按位OR。我在下面添加了主要功能。

#include <stdio.h>
#include <stdlib.h>

void printbits(int b){
    int i;
    int s = 8 * (sizeof b) - 1; /* 31 if int is 32 bits */
    for(i=s;i>=0;i--)
    putchar( b & 1<<i ? '1' : '0');
}



int main(){
    char dir; /* L=left R=right */
    int val, n, i;

    scanf("%d %d %c",&val, &n, &dir);
    printbits(val);putchar('\n');
    for (i=0; i<10; i++){
    if (dir=='L' || dir =='l')
      rotateLeft(&val, n);
    else
      rotateRight(&val,n);      
    printbits(val); putchar('\n');
    }
return;
}

这是rotateLeft en rotateRight函数。

#include <stdio.h>
#include <stdlib.h>

void rotateLeft(int *val, int N){
    int num = val[0];
    int pos = N;

    int result = num << pos;


}

void rotateRight(int *val, int N){
    int num = val[0];
    int pos = N;

    int result = num >> pos;


}

3 个答案:

答案 0 :(得分:0)

MSB = (n >> (NUM_OF_BITS_IN_INT - 1))
n = (n << 1) | MSB;

n左位旋转1位。

你只是摆脱了MSB,但没有将它添加回LSB位置。

答案 1 :(得分:0)

使用此链接中的功能执行旋转:

https://en.wikipedia.org/wiki/Circular_shift

答案 2 :(得分:0)

以下是完整源代码的经过测试的非优化解决方案:

void rotateLeft(int *val, int N){
    unsigned int num = val[0];
    int pos = N;

    unsigned int part1 = num << pos;
    unsigned int part2 = (num >> ((sizeof(val[0])*CHAR_BIT)-pos));

    if (N != 0) {
        val[0] = part1 | part2;
    }
}

void rotateRight(int *val, int N){
    unsigned int num = val[0];
    int pos = N;

    unsigned int part1 = num >> pos;
    unsigned int part2 = (num << ((sizeof(val[0])*CHAR_BIT)-pos));

    if (N != 0) {
        val[0] = part1 | part2;
    }
}
  

为防止在右移期间自动携带,您必须这样做   将值视为unsigned int。

为防止N = 0干扰,仅在(N!= 0)时将结果分配给条目。 (见帖子ROL / ROR on variable using inline assembly in Objective-C上的评论)