该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
八进制换成二进制楼主应该没有换算错误。真不会换算,拿附件里面的科学计算机也能换。
说说5L的问题所在,首先是语法问题,scanf("a=%o,n=%d",&a,&n);这句是不对的,scanf不能这么写,里面不能带常规字符。这样会出错,你不信的话,你直接printf出a和n的值看看。其次是%o在scanf和printf里面不一样,%o在scanf里面是获取有符号的八进制,而在printf里面是打印输出无符号的八进制,所以最好不要用八进制来写,下面的代码我用了十进制。这是两个语法错误,楼主应该好好扎实基础。
其次,是语义错误,也就是其实你这么写,我个人认为,仅仅是我个人认为是不对的,你这是循环右移程序,而你左移的时候有个16-n,这里的16是什么意思?难道是占的内存位数,那为啥不是32,然后我找到了网上普遍存在的两个宏代码,验证过去之后,发现把16换成32和网上的宏代码输出结果一样。即如下代码你看看最后2个printf是一样的结果:
#define CROR(value, bits) ((value >> bits) | (value << (0x20 - bits)))
#define CROL(value, bits) ((value << bits) | (value >> (0x20 - bits)))
#include
int main(){
unsigned a,b,c,d; int n;
printf("请输入a和n\n"); scanf("%u,%d",&a,&n);//示例输入0157653,3 //0157653(十进制)= 100110011111010101(二进制)
b=a<>n; d=c|b;
printf("%u %u %u %u\n",a,b,c,d);
printf("%u\n", CROR(a, n));
return 0;
}
排版不好,请见谅。
但是其实你用附件里面的科学计算机算一下0157653的循环右移三位的值,和上面得出的是不一样的,所以我个人大胆猜测网上的代码是错误的,具体原因在于循环右移的左移操作是错误的,即循环右移的左移0x20-bits那个是错误的,因为在内存中,我们的值前面会补0。上面那句话是我个人感觉的,我的意思就是想说假如内存存储整数用8位,我们的数是1011,那么实际存储的时候应该是00001011对不对,这样循环右移的左移操作就发生了错误。你可以动手在纸上画画,我是这么感觉的,也有可能是我昨天熬夜脑子不清醒。