[讨论] 双班 hw 9-2

楼主: oncemore (超级喜欢林玮恩)   2011-12-05 21:38:06
给一些不会做circular shift 的同学参考,当然这不是唯一解
假设一个数字(number),经过运算之后会得到一个数值(result)
你现在的任务就是要把题目给的result 转换成原本的number。
int number;
int number_mod;
int result;
int shift;
not 的部分:
number = ~number;
result = number + 256;
(Ex.)以范例测资1来说,
df(16进位) = 223 (10进位)...我们要的result是223
number = 32;(要得到223的解)
number = ~number; (此时number == -33 )
result = number + 256; (result == 223)
所以我们找到32经过not的运算后可以得到df,也就是223,
所以要把(ASCII码)32对应到的字符印出来。
这里你可以用 number 从 0 跑到 255 去找出对应的值,
找到了之后就记录起来并 break 掉。
leftR 的部分:(假设要转的位数是shift位)
number = number * pow( 2 , shift%8 ); (你要include <math.h> )
number_mod = number % 256;
number = number / 256;
result = number + number_mod;
(Ex.)以范例测资1来说,
leftR 3,向左侧移三位。
1(16进位) = 1(10进位)...我们要的result是1
shift = 3;
number = 32;(要得到1的解)
number = number * pow(2,shift%8); (number == 32 * 8 == 256 )
number_mod = number % 256;(number_mod == 0 )
number = number / 256;(number == 1 )
result = number + number_mod; (result == 1 + 0 == 1 )
于是我们找到了32可以经过左移三位后得到1
rightR 的部分:(假设要转的位数是shift位)
number = number * 256;
number = number / pow( 2 , shift%8 );
number_mod = number % 256;
number = number / 256;
result = number + number_mod;
(Ex.)以范例测资1来说,
rightR 4,向右侧移四位。
2(16进位) = 2(10进位)...我们要的result是2
shift = 4;
number = 32(要得到2的解)
number = number * 256; (number == 8192)
number = nubmer / pow ( 2 , 4 ); (number == 512)
number_mod = number % 256; (number_mod == 0)
number = number / 256; (number == 2)
result = number + number_mod; (result = 2)
于是我们找到了32可以经过右移四位后得到2
补充:对于left 和 right 的作法,
我是想像成16个bits在做运算
以上是我的作法,
请各位多多指教,谢谢。
楼主: oncemore (超级喜欢林玮恩)   2011-02-05 21:59:00
有传闻说hw 10 的deadline 可能会提前到这礼拜,所以大家尽量能早点完成就早点完成

Links booklink

Contact Us: admin [ a t ] ucptt.com