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

标签 c algorithm rotation bit-manipulation

我正在尝试让我的程序运行,我将位向左移动并将移位的位添加到右侧。例如00111000,如果你将它向左移动4个位置,结果应该是10000011。我怎样才能使这项工作,我知道我需要使用按位或。我在下面添加了主要功能。

#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;


}

最佳答案

这是一个经过测试且未优化的解决方案来完成您的源代码:

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

To prevent automatic carry during the shift right, you have to consider value as unsigned int.

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

关于c - 如何向左旋转位并向右添加旋转位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40203169/

相关文章:

c++ - 字节交换和 C++/C

c - wValue 在通过 USB 与 "USB HID Red Visual Indicator"交互时扮演什么角色?

c++ - posix 中的内核线程

c - Do while 循环给出意外的输出

python - 如何绘制满足多个定积分的曲线?

iOS动画旋转一个角度

algorithm - 最佳聚类算法? (简单解释)

python - python中的排序算法帮助

Android 模拟器 - 屏幕旋转

ios - ios动画,旋转按钮,按钮突然改变位置