通过最高位对齐位模式

时间:2017-05-18 11:32:41

标签: c bit xor

我想对两个数字进行异或,如下所示:

11001110和110

但是,我需要将位模式对齐:

11001110
11000000

任何想法如何做到这一点?我想可能需要一些按位操作,虽然我怎么知道要移位多少位?

2 个答案:

答案 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;
}