我现在正试图理解这种逻辑转换是如何工作的。
给出公式:

int logicalShift(int x, int n){
    int mask = x >> 31 << 31 >> n << 1;
    return mask^ (x>>n);
}

x = 0x87654321 and n = 4.的试运行给出了logicalShift(x,n) = 0x08765432
这里,我知道二进制中的x是1000 0111 0110 0101 0100 0011 0010 0001并且遵循掩码过程,
x>>31是0000 0000 0000 0000 0000 0000 0000 0001
1000 0000 0000 0000 0000 0000 0000 0000
并且>>n这是0000 1000 0000 0000 0000 0000 0000 0000
而<0001 0000 0000 0000 0000 0000 0000 0000。
doingmask^ (x>>n)意味着用0001 0000 0000 0000 0000 0000 0000 00000000 1000 0111 0110 0101 0100 0011 0010执行异或操作,这将导致0001 1000 0111 0110 0101 0100 0011 0010这将是0x18765432。
我换错了吗?

最佳答案

是的,你换错了。当>>的左操作数是有符号整数时,编译器通常执行算术右移,而不是逻辑右移。这在函数名中有暗示:如果>>执行了逻辑右移,它可以直接返回x >> n。函数的重点是通过使用算术右移来实现逻辑右移。
算术右移的意思是,当右移时,左边的位不是用零填充的,而是用最左边的位(符号位)填充的。因此:
x>>31是0000 0000 0000 0000 0000 0000 0000 0001
x>>31实际上是1111 1111 1111 1111 1111 1111 1111 1111

关于c - c理解中的逻辑转变,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49840562/

10-11 23:03
查看更多