我们可以假设 int 在 2 的补码中是 32 位唯一合法的运算符是:!~ & ^ | + << >>
在这一点上,我正在使用蛮力
int a=0x01;
x=(x+1)>>1; //(have tried with just x instead of x+1 as well)
a = a+(!(!x));
...最后两条语句重复了 32 次。每次将 x 移动一位时,这会将 1 加到 a 上,对于所有 32 位,!= 0
使用测试编译器,它说我的方法在测试用例 0x7FFFFFFF(一个 0 后跟 31 个 1)上失败,并说这个数字需要 32 位来表示。我不明白为什么这不是 31 (我的方法计算出来的) 谁能解释为什么?我需要改变什么来解决这个问题?