|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
任务描述
本关任务:编写完整的程序,从终端输入一个无符号短整数k,输出将k的高4位和低4位交换后的结果。例如,程序执行时:
输入:54321(对应二进制为11010100 00110001);
输出:5181 (对应二进制为00010100 00111101)。
相关知识
为了完成本关任务,你需要掌握:
标准输入输出格式;
移位操作;
有符号整数和无符号整数区别。
- #include <stdio.h>
- int main(){
- /**********Begin**********/
- unsigned short k,x;
- scanf("%d",&k);
- x=((k>>4)<<8)>>4|(k<<12)|(k>>12);
- printf("%d",x);
- /**********End**********/
- return 0;
- }
复制代码
测试输入12,123,1234都能得到正确结果,输入12345时得到45107,正确结果是36915.
请求debug!在我的程序基础上修改,不要给出用其他方法的代码。
本帖最后由 xieglt 于 2020-10-25 09:13 编辑
帮你调试了一下,找到了原因。
看图。我用了3种方式去掉高4位和低4位,
第一种
x = k >> 4;
x <<= 8;
x >>= 4;
x = k >> 4 编译成汇编代码是 sar cx,4 sar 是算术右移指令,它将保留最高位,所以会保留最高位的1
x <<= 8 汇编代码是 shl dx,8 shl 是逻辑左移指令
x >>= 4 汇编代码是 shr ax,4 shr 是逻辑右移右移指令,它不会保留最高位
最后得出 x = 48;
再看第二种,也就是你在程序里用的那种。
y = (k>>4)<<8)>>4
翻译成汇编代码是
sar ecx,4
shl ecx,8
sar ecx,4 右移全是用的算术右移sar,所以最高位被保留
最后得出 y 是 12336
第三种
z = k & 0X0FF0 这种应该是最靠普的。跟翻译过去的汇编指令无关
得出 z = 48
因此,得出结论,是因为编译器把 右移指令 翻译成指令 sar ,导致最高位保留造成的。
|
|