C中任何整数的旋转位

将整数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 > 1; } else if (direction == 'L') { if ((x & 128) == 1) x = (x ^ 129); else x = x << 1; } } result = (result ^ x); return result; } 

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

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

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

右旋的00100001 。 如果你再次右旋,你得到1000 。 看, 1缠绕或旋转到整数的另一侧。

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

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

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

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

您应该能够找到一种类似的右旋转方法。

祝好运!

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

但是,我正在做一些K&R练习来刷新我的C,并希望分享这个旋转到正确的function,这对于试图学习逐位操作的人来说可能会派上用场。

 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参数。

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

看起来你向右旋转是正确的。 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 – 实际转移它

去吧,玩吧。 它最终会奏效!

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

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

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