1

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

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

(将位左移 1)

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

但如果我通过这个:

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

它将返回 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;   
}
4

7 回答 7

6

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

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

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

0010右旋为0001。如果你再次右旋,你得到1000. 看,1环绕或旋转到整数的另一侧。

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

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

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

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

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

祝你好运!

于 2010-10-13T23:15:41.400 回答
4

接受的答案非常好且直截了当。

但是,我正在做一些 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;
}

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

请注意,此功能有利于可教性/易读性/简单性,而不是效率/便携性/紧凑性。

于 2013-02-17T00:53:21.397 回答
1

由于没有人告诉你如何实现这一点,你可以使用内在函数,对于 Visual Studio,它们是 _rotl、_rotl64、_rotr、_rotr64。

哦,但是轮换和轮班是两件不同的事情!

于 2010-10-13T23:25:12.993 回答
1

我也在读 K&R,所以这是一个非常简单的 unsigned int 旋转函数:

unsigned int rightrot(unsigned int x, unsigned int n)
{
  return (x >> n) | (x << (sizeof(int) * CHAR_BIT - n)); /* CHAR_BIT is defined in limits.h */
}

unsigned int leftrot(unsigned int x, unsigned int n)
{
  return (x << n) | (x >> (sizeof(int) * CHAR_BIT - n));
}

n要旋转的位数在哪里。

于 2021-03-10T14:36:24.790 回答
0

看一下按位移位运算符:

http://en.wikipedia.org/wiki/Bitwise_operators#Shifts_in_C.2C_C.2B.2B_and_Java

于 2010-10-13T22:48:04.920 回答
0

看起来你向右旋转是正确的。1 从侧面摔倒又从左边回来了?

无论如何,这里是你的成分:

http://tigcc.ticalc.org/doc/keywords.html#if - 用于确定它是“L”还是“R”

http://tigcc.ticalc.org/doc/keywords.html#for - 用于计算移位次数

http://msdn.microsoft.com/en-us/library/f96c63ed(VS.80).aspx - 实际转移它

去,玩它。它最终会起作用的!

于 2010-10-13T23:19:01.377 回答
-1

我建议使用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)));
}
于 2010-10-13T23:22:09.260 回答