c - 减少操作次数

标签 c bit-manipulation

我有一个函数可以切换每个十六进制数字的第 0 位和第 3 位,但它使用 26 次操作。我只想将其减少到 1 到 25 次操作。仅使用位运算! ~ & ^ | + << >>.

int swap30(int x) {
    int m = 0b10001000 << 24;
    int m1 = 0b10001000 << 16;
    int m2 = 0b10001000 << 8;
    int m3 = 0b10001000;
    int mask1 = m | m1 | m2 | m3;

    int z = 0b01100110 << 24;
    int z1 = 0b01100110 << 16;
    int z2 = 0b01100110 << 8;
    int z3 = 0b01100110;
    int mask2 = z | z1 | z2 | z3;

    int y = 0b00010001 << 24;
    int y1 = 0b00010001 << 16;
    int y2 = 0b00010001 << 8;
    int y3 = 0b00010001;
    int mask3 = y | y1 | y2 | y3;

    int three = x & mask1;
    int stable = x & mask2;
    int one = x & mask3;
    int final2 = ((three >> 3) & mask3) | stable | (one << 3);
    return final2;
}

最佳答案

return (x & 0x66666666) | ((x >> 3) & 0x11111111) | ((x & 0x11111111) << 3);

关于c - 减少操作次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22185351/

相关文章:

c - 如何创建指针数组?

c - C 中的数据验证

c++ - 使用按位运算符设置移位位

c++ - 编译和链接调用 C++ 函数的 C 代码

c - 在 C 中按名称和编号引用数据

c - 为什么条件运算符是右结合的?

java - 从文件 java 中获取特定位数

c++ - 反转按位左移和或赋值

C# 按位或运算符用于符号扩展操作数;首先考虑转换为较小的无符号类型

language-agnostic - 给定一个整数,如何使用位旋转找到下一个最大的二的幂?