c - 旋转 C 中任何整数的位

标签 c integer rotation bit

将整数 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;   
}

最佳答案

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

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

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

0010 向右旋转是 0001。如果您再次向右旋转,您将得到 1000。请看,1 环绕或旋转到整数的另一侧。

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

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

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

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

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

祝你好运!

关于c - 旋转 C 中任何整数的位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3928659/

相关文章:

解析时间军事时间字符串的极端情况

c - 使用 minifilter 驱动程序的 USB 阻塞(passThrough)

Swift - 旋转手势和 90 度的旋转增量

c - 在c中显示以 '*'分隔的正数的质因数

c - 如何处理索引大于 32 位的数据结构?

string - XSLT 中的整数到字符串转换

Python自己改变Float中的Integer

java - 迭代器返回错误的整数值

c++ - 当仅需要 X-Y 旋转时,3D 对象沿所有三个轴旋转

matrix - 我可以在四元数中切换X Y Z吗?