我想对两个数字进行异或,如下所示:
11001110和110
但是,我需要将位模式对齐:
11001110
11000000
任何想法如何做到这一点?我想可能需要一些按位操作,虽然我怎么知道要移位多少位?
答案 0 :(得分:0)
这是一次尝试,假设我的要求是正确的:
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)。
答案 1 :(得分:-1)
要了解在Windows上移位多少位,您可以使用此特定于MS的功能:_BitScanReverse或者您可以实现自己的功能:
int findFirstSetBit(uint32_t _n)
{
int idx = 31;
for( ; idx >= 0; --idx){
if(_n & (1 << idx) != 0){
return idx;
}
}
return -1;
}