旋转C中任何整数的位

时间:2010-10-13 22:45:36

标签: c integer rotation bit

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

的整数
x = 2;
x = rotateInt('L', x, 1); 

(将位左移1)

实施例: 00000010 - >向左旋转1 - >; 00000100

但如果我通过了这个:

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

它将返回64,010000

以下是代码,有人可以更正错误...谢谢

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

7 个答案:

答案 0 :(得分:4)

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

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

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

右侧旋转

00100001。如果再次右旋,则会得到1000。请参阅1缠绕或旋转到整数的另一侧。

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

请注意,旋转不会将符号位保持为算术右移。

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

  1. 捕获最左侧的值。 (它是0还是1?)
  2. 左转
  3. 根据我们从步骤1中捕获的内容,将最右边的位置设置为正确的值,这是我们在步骤1中讨论的位(需要将其旋转)到正确的值。
  4. 你应该能够找到一种类似的右旋转方法。

    祝你好运!

答案 1 :(得分:3)

接受的答案是非常好的和直接的。

然而,我正在做一些K&amp; 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参数。

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

答案 2 :(得分:0)

答案 3 :(得分: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 - 实际改变它

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

答案 4 :(得分:0)

由于没有人告诉你如何实现这个,你可以使用内在函数,对于visual studio,它们是_rotl,_rotl64,_rotr,_rotr64。

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

答案 5 :(得分:0)

我也在读 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 是要旋转的位数。

答案 6 :(得分:-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)));
}