我想对两个数字进行异或运算,如下所示:
11001110 和 110
但是,我需要这样对齐位模式:
11001110
11000000
有什么想法可以做到这一点吗?我想可能需要一些按位运算,但我怎么知道要移动多少位?
最佳答案
假设我满足了要求,这是一次尝试:
int topbit(unsigned int x)
{
for (int i = CHAR_BIT * sizeof x - 1; i >= 0; --i)
{
if (x & (1u << i))
return i;
}
return -1;
}
unsigned int alignedxor(unsigned int a, unsigned int b)
{
const int topa = topbit(a);
const int topb = topbit(b);
if (topa < 0)
return b;
if (topb < 0)
return a;
if (topa > topb)
return a ^ (b << (topa - topb));
return (a << (topb - topa)) ^ b;
}
int main(void) {
printf("%x\n", alignedxor(0xce, 6));
printf("%x\n", alignedxor(6, 0xce));
return 0;
}
这将打印 e
两次,这似乎是正确的,但这就是我所做的所有测试。
是的,您可以更有效地获取最高 1 位的索引,但谁在乎呢?还发挥了我丰富的想象力来处理极端情况(例如一个数字为0)。
关于c - 按最高有效位对齐位模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44046596/