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对无符号整数进行逻辑转换。
旋转的确如此:它与逻辑移位相同,除非您移过数字的末尾,数字“环绕”到另一侧。 例如
右旋的0010
是0001
。 如果你再次右旋,你得到1000
。 看, 1
缠绕或旋转到整数的另一侧。
左旋转类似: 0100
左旋转1000
左旋转0001
左旋转0010
等
请注意,旋转不会将符号位保持为算术右移。
所以,C只有算术移位。 所以你必须手动实现“旋转”部分。 所以,采取左旋转。 你会想:
- 捕获最左边的位的值。 (它是0还是1?)
- 左转
- 根据我们从步骤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))); }