c - 如何交换二进制数中的每 2 位?

标签 c bit-manipulation

我正在研究这个编程项目,其中一部分是编写一个仅包含按位运算符的函数,该运算符每两位切换一次。我提出了一种梳状算法来完成此任务,但它仅适用于无符号数字,有什么想法可以让它也适用于有符号数字吗?我完全被这个问题难住了。这是我到目前为止所拥有的:

        // Mask 1 - For odd bits
    int a1 = 0xAA; a1 <<= 24;
    int a2 = 0xAA; a2 <<= 16;
    int a3 = 0xAA; a3 <<= 8;
    int a4 = 0xAA;
    int mask1 = a1 | a2 | a3 | a4;

    // Mask 2 - For even bits
    int b1 = 0x55; b1 <<= 24;
    int b2 = 0x55; b2 <<= 16;
    int b3 = 0x55; b3 <<= 8;
    int b4 = 0x55;
    int mask2 = b1 | b2 | b3 | b4;

    // Mask Results
    int odd = x & mask1;
    int even = x & mask2;

    int newNum = (odd >> 1) | (even << 1);

    return newNum;

通过将变量“或”在一起来手动创建掩码是因为唯一可以使用的常量位于 0x00-0xFF 之间。

最佳答案

问题是 odd >> 1 将以负数对扩展进行签名。只需再执行一次and即可消除重复的位。

int newNum = ((odd >> 1) & mask2) | (even << 1);

关于c - 如何交换二进制数中的每 2 位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18880217/

相关文章:

c++ - 为什么在 Solaris 上生成的调用堆栈中的函数总是显示 6 个参数?

c++ - 在 C 中添加和删除 a ( void * )

c++ - 如何在 OpenGL 中使用 glOrtho()?

c++ - 跟随位操作的优化机会?

swift - 如何在 Swift 中对两个二进制数进行按位或运算?

c - c程序的简单Makefile

c - 读取由 12 个数字组成的数组,每个数字之间有空格 - C 编程

c - 无重复创建二维数组的最佳方法

c - 在 C 中使用位运算对 float 进行向下舍入

使用一种按位 : I'll get duplicated values? 的 C++ 函数