所以我有一个任务,我必须在 c 中编写一个函数,该函数只使用 ~ 、 & 、 ^ 、 | 的按位运算。、 + 、 << 、 >> 和 =。我只需要使用 20 次操作。而且我不允许使用控制结构,例如 if-else 、for、while、switch 或任何其他在条件块中执行代码的东西。类型转换也被淘汰了,函数头(给我的)中未声明的字节被限制为 1 字节或 8 位值;所以我有十六进制0到FF。
我必须编写的函数是逻辑右移。因此,与其用符号位填充位,不如用 0 填充
这就是我所做的:
int logicalShift(int x, int n) {
int op=0xFFFFFFFF;
int tcn=(~n+1);
int sizeshift=0x20 & tcn;
op=(op<<sizeshift);
return ((x>>n) + (op));
}
这是我期望得到的(对于 x=0x80000000 和 n=0x01),我期望得到 0x40000000,即十进制的 1073741824。这就是我得到的。但是(对于x = 0x80000000和n = 0x0,我希望得到0x80000000,但是我得到0x7fffffff,这是我的答案减去一点。我可以添加一点,但它弄乱了第一个答案。所以我做错了什么我有一个案例,但没有另一个。我也试过了。
int logicalShift(int x, int n) {
int op=0xFFFFFFFF;
int tcn=(~n+1);
int sizeshift=0x20 & tcn;
op=(op<<sizeshift);
return ((x>>n) + (op ^ ~n));
}
我认为,如果我对 0 情况下的所有 1 的符号位进行异或运算,我最终会在编译器转换为 2 的补码时得到不是负数(又名)0x7fffffff 的东西。它最终使情况变得更糟。请让我朝着正确的方向前进,我应该考虑什么,为什么?