所以我有一个任务,我必须在 c 中编写一个函数,该函数仅使用 ~ 、 & 、 ^ 、 | 的按位运算。 、+、<<、>> 和 =。我只需要使用 20 个操作。而且我不允许使用控制结构,例如 if-else、for、while、switch 或任何其他在条件 block 中执行代码的结构。此外,类型转换也被淘汰了,函数头(给我的)中未声明的字节被限制为 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 的情况,我最终会得到一些非负数(又名)0x7fffffff,当它通过编译器转换为 2 的补码时。它最终使情况变得更糟。请给我指明正确的方向,我应该考虑什么以及为什么?
最佳答案
逻辑移位和算术移位的区别在于从左边移入的位。要根据算术实现逻辑移位,您可以进行算术移位,然后清除新位。在伪代码中:
- 生成一个掩码,当与结果进行与运算时,它将清除最左边的 n 位。
- 右移 n 位。
- 还有面具。
使用 AND 意味着您不必关心移入了哪些位。您只想无条件地将它们设置为 0。
接下来的问题是如何生成掩码。我会把它留给你作为练习。
关于c - 仅使用 "~ & ^ | + << >> ="个运算符和 20 个运算实现逻辑右移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19203143/