c - 如何执行一个字节的循环旋转?

标签 c bitmask

我正在尝试实现一个函数,该函数执行一个字节向左和向右的循环旋转。

我为这两个操作编写了相同的代码。例如,如果您向左旋转,1010 将变为 0101。这是正确的吗?

unsigned char rotl(unsigned char c) {
    int w;
    unsigned char s = c;
    for (w = 7; w >= 0; w--) {
       int b = (int)getBit(c, w);//
       if (b == 0) {
           s = clearBit(s, 7 - w);
       } else if (b == 1) {
           s = setBit(s, 7 - w);
       }
    }
    return s;
}

unsigned char getBit(unsigned char c, int n) {
    return c = (c & (1 << n)) >> n;
}

unsigned char setBit(unsigned char c, int n) {
    return c = c | (1 << n);
}

unsigned char clearBit(unsigned char c, int n) {
    return c = c &(~(1 << n));
}

最佳答案

C中没有旋转运算符,但是如果你这样写:

unsigned char rotl(unsigned char c)
{
    return (c << 1) | (c >> 7);
}

然后,根据这个:http://www.linux-kongress.org/2009/slides/compiler_survey_felix_von_leitner.pdf (第 56 页),编译器将弄清楚你想做什么,并仅在一条(非常快的)指令中执行它的旋转。

关于c - 如何执行一个字节的循环旋转?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19204750/

相关文章:

C:计数 `new line` 直到达到双倍空格

c - 如何在C中读取无限字符

c - 带有指针参数 C 的测试函数

c++ - 用掩码交错位

c++ - C 中 lockFree 列表的标记指针

error-handling - F#HashCode到枚举转换

Javascript 位掩码

c - C 中的未知类型错误

c - 按属性值对结构数组进行排序