我现在正试图理解这种逻辑转换是如何工作的。
给出公式:
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。
doing
mask^ (x>>n)
意味着用0001 0000 0000 0000 0000 0000 0000 0000
对0000 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/