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