C中任意整数的旋转位

yhived7q  于 2023-04-11  发布在  其他
关注(0)|答案(7)|浏览(149)

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

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

(left将位移位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;   
}
scyqe7ek

scyqe7ek1#

我假设你们知道什么是左移和右移,也知道算术移位和逻辑移位的区别。
C只有算术移位,它不做逻辑移位,也不做旋转,好吧,我撒谎了,C对无符号整型做逻辑移位。
一个旋转,好吧,正是这样:它与逻辑移位相同,除了当您移位超过数字的末尾时,数字会“绕回”到另一侧。例如
0010右旋转后的结果是0001。如果再次右旋转,得到1000。看,1绕到整数的另一边。
左旋转类似:0100左旋转1000左旋转0001左旋转0010等。
注意,旋转不像算术右移那样保留符号位。
所以,C只有算术移位。所以你必须手动实现“旋转”部分。所以,采取左旋转。你会想要:
1.捕获最左边的位的值。(它是0还是1?)
1.做左移
1.根据我们从步骤1中捕获的内容,将最右边的位-即我们在步骤1中讨论的位(需要旋转)设置为正确的值。
你应该能够找出一个类似的方法右旋转。
祝你好运!

w46czmvw

w46czmvw2#

公认的答案是非常好的和直接的。
然而,我正在做一些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参数。
请注意,此功能更倾向于可教性/易读性/简单性,而不是效率/可移植性/紧凑性。

rlcwz9us

rlcwz9us3#

由于没有人告诉你如何实现它,你可以使用intrinsic,对于visual studio,它们是_rotl,_rotl64,_rotr,_rotr64。
哦,但是轮换和轮班是两回事!

xqkwcwgp

xqkwcwgp4#

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

klr1opcd

klr1opcd5#

看看按位移位运算符:
http://en.wikipedia.org/wiki/Bitwise_operators#Shifts_in_C.2C_C.2B.2B_and_Java

uemypmqf

uemypmqf6#

看起来你的向右旋转是正确的。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-实际移动它
去吧,玩吧,它最终会起作用的!

pdkcd3nj

pdkcd3nj7#

我建议使用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)));
}

相关问题