求满足指定位运算条件的x值,及x=12、x=-1时的运算疑问
位运算问题解答
一、求满足条件的x取值
已知两个条件:
s = x >> 31(32位有符号数的算术右移)x = (s & ~x) | (~s & x)
先分析第二个等式:(s & ~x) | (~s & x) 等价于 s ^ x(异或运算的定义:对应位不同则为1,相同则为0)。因此等式可简化为:x = s ^ x
对等式两边同时异或x,得到:0 = s
结合第一个条件s = x >> 31,32位有符号数的算术右移规则为:
- 非负数(x ≥ 0)右移31位,结果为0
- 负数(x < 0)右移31位,结果为-1(二进制全1)
因此s=0意味着x必须是32位有符号非负整数,即取值范围为 0 ≤ x ≤ 2^31 - 1。
二、疑问解答
1. x=12时的运算结果判断
32位环境下x=12的二进制为0000 0000 0000 0000 0000 0000 0000 1100,执行s = x >>31后,s=0。代入等式:(s & ~x) | (~s & x) = (0 & ~12) | (0xFFFFFFFF & 12) = 0 | 12 = 12
与原x值相等,因此该判断正确。
2. x=-1时的相关判断
32位有符号数中,x=-1的二进制为1111 1111 1111 1111 1111 1111 1111 1111:
x >>31是算术右移,负数右移高位补1,结果为1111 1111 1111 1111 1111 1111 1111 1111,对应十进制的-1,不是1,所以你的判断错误。- 此时s=-1(二进制全1),
~x为0000 0000 0000 0000 0000 0000 0000 0000,所以s & ~x = 0xFFFFFFFF & 0x00000000 = 0; ~s为0000 0000 0000 0000 0000 0000 0000 0000,所以~s & x = 0x00000000 & 0xFFFFFFFF = 0;- 最终
(s & ~x) | (~s & x) = 0 | 0 = 0,与x=-1不相等,符合之前的结论(负数不满足条件)。
内容的提问来源于stack exchange,提问作者Waldener
相关产品推荐
相关产品推荐

