C中任何整数的旋转位

Tim*_*Tim 1 c integer rotation bit

将整数 2 传递给此函数,然后返回一个整数 4

x = 2;
x = rotateInt('L', x, 1); 
Run Code Online (Sandbox Code Playgroud)

(左移1位)

示例:00000010 -> 向左旋转 1 -> 00000100

但如果我通过这个:

x = rotateInt('R', x, 3); 
Run Code Online (Sandbox Code Playgroud)

它将返回 64, 01000000

这是代码,有人可以纠正错误...谢谢

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;   
}
Run Code Online (Sandbox Code Playgroud)

pou*_*def 6

所以,我假设你知道右移和左移是什么。并且您知道算术移位和逻辑移位之间的区别。

C 只有算术移位。它不进行逻辑转换,也不进行轮换。好吧,我撒谎了,C 对无符号整数进行逻辑转换。

轮换确实如此:它与逻辑移位相同,除了当您移过数字的末尾时,数字“环绕”到另一侧。例如

0010向右旋转的是0001。如果再次向右旋转,则会得到1000。看,1环绕或旋转到整数的另一侧。

左旋类似:0100左旋1000左旋0001左旋0010等。

请注意,旋转不会像算术右移那样保留符号位。

所以,C 只有算术移位。所以你必须手动实现“旋转”部分。所以,左旋。你会想要:

  1. 捕获最左边位的值。(是 0 还是 1?)
  2. 做一个左移
  3. 根据我们从步骤 1 中捕获的内容,将最右边的位(即我们在步骤 1 中讨论的位(需要旋转)设置为正确的值。

您应该能够找出类似的右旋方法。

祝你好运!


Ric*_*aez 6

接受的答案非常好而且直接。

然而,我正在做一些 K&R 练习来刷新我的 C,并想分享这个向右旋转的函数,这对于尝试学习按位运算的人来说可能会派上用场。

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;
}
Run Code Online (Sandbox Code Playgroud)

对于左旋转,只需将 -1 到 -31 之间的值传递给bitAmount参数即可。

请注意,此功能更注重可教性/易读性/简单性,而不是效率/可移植性/紧凑性。