c - 按最高有效位对齐位模式

标签 c bit xor

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

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/

相关文章:

c - 如何解决我的位移 C 代码中的以下错误?

java - Java 的 32 位整数表示系统需要澄清吗?

c++ - CRC32 C++ 实现使用 bool 数组并逐位手动异或

c - 有没有办法在 AVR gcc 中为引脚定义宏,以便我可以将它们作为变量访问?

c - 多维数组指针

c++ - 遍历所有可能的位排列

function - 三路异或类函数

javascript - 了解复杂的 JavaScript 密码算法

c - 将char指针写入文件,读取文件并检查大小?

c - 关于字符串比较 char* 和数组字符串的区别的解释