因此,我有一项工作,我必须在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));
}
Run Code Online (Sandbox Code Playgroud)
这就是我期望得到的结果(对于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));
}
Run Code Online (Sandbox Code Playgroud)
我以为,如果我对0的情况下的位进行异或运算,以将全为1的符号位清零,那么在经过编译器转换为2的补码时,我得到的结果将不是负数(aka)0x7fffffff。最终使情况变得更糟。请设定正确的方向,我应该考虑什么,为什么?
我做了这个小程序只是想知道如何在C中进行逻辑移位.
#include <stdio.h>
int main (void)
{
int n=-2,t;
t = (int)((unsigned int)n >> 1);
printf("%d\n",t);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,它输出
2147283747.我在这里遗漏了什么吗?答案不应该是7?