20135202闫佳歆-第二章家庭作业-2.69
第二章家庭作業
選題:2.69
分值:三分
作業過程:
以下是rotate_right函數的代碼:
unsigned rotate_right(unsigned x, int n) {int endbit;int i;if(n==0)return x;else{for(i=0;i<n;i++){endbit = x & 0x1;endbit = endbit << (8*sizeof(unsigned)-1);x = x >> 1;x = x | endbit;}}return x; }這里用到的原理是,區分n的情況,如果是0則直接返回原值,如果不是0,就按照移位的次數控制循環,每次循環只移位1位。
具體循環的實現,是借助了一個變量為endbit,最后一位,用來保留右移一位后損失掉的那位,再通過移位使這位變成最高位,最后與x移位后的數據進行或運算,這樣就完成了循環右移一次的功能;共需循環右移幾次,就重復幾次這個循環。
完成的代碼如下:
#include <stdio.h>unsigned rotate_right(unsigned x, int n);int main() {int n = 0;unsigned x;int w = sizeof(unsigned)*8;int flag = 0;unsigned result;while(!flag){printf("please input how many bits you want to rotate_right shift:\n");scanf("%d",&n);if (n < 0 || n >= w){printf("Wrong! Please input again!\n");}elseflag = 1;}printf("please input your data:\n0x");scanf("%x",&x);result = rotate_right(x,n);printf("the result is:0x%x\n",result);return 0; }unsigned rotate_right(unsigned x, int n) {int endbit;int i;if(n==0)return x;else{for(i=0;i<n;i++){endbit = x & 0x1;endbit = endbit << (8*sizeof(unsigned)-1);x = x >> 1;x = x | endbit;}}return x; }實驗運行結果如下:
實驗中遇到的問題:
這個函數原型的構造并不難,找到思路后困擾我一時的只是是用或還是與,這個很容易就能夠解決,更大的問題在我的主函數中輸入無論如何都得不到正確的結果,后來發現是因為我的輸入是0x12345678,我以為這個可以直接轉換為16進制但是不可以,輸出也是十進制,所以這導致了我的結果錯誤百出,后來我通過百度發現了%x的方法,輸入輸出格式改為這個之后就可以方便的輸入輸出16進制,并且在輸入之前加了提示語0x,就可以得出正確的結果了。
這道題本身難度不算大,我主要還是栽在了自己的粗心上,沒有注意輸入輸出格式,只想當然的去做,吸取了這次教訓,以后的作業就不會有那么多冤枉路了。
代碼的優化
從每次右移一位,按循環次數控制右移位數,能不能擴展成一步到位移動n位呢?我把代碼變成了以下樣子:
unsigned rotate_right(unsigned x, int n) {int endbit;int i;if(n==0)return x;else{endbit = x << (8*sizeof(unsigned)-n);x = x >> n;x = x | endbit;}return x; }這樣就可以直接移動n位了。
這里還有一個小插曲,關于開始的左移位數是要-n還是-什么,是右移了n位,上面的左移就要減n。
然后我又想,n=0的情況能不能并進去?代碼就變成了這樣子:
unsigned rotate_right(unsigned x, int n) {int endbit;endbit = x << (8*sizeof(unsigned)-n);x = x >> n;x = x | endbit;return x; }驗證是可以的。
endbit作為一個中間值,是不是有點多余?去掉之后變成:
unsigned rotate_right(unsigned x, int n) {x = (x >> n) | x << (8*sizeof(unsigned)-n);return x; }也是可以的,更簡潔了。
那么可以干脆直接用return返回:
unsigned rotate_right(unsigned x, int n) {return (x >> n) | x << (8*sizeof(unsigned)-n); }這個一步步簡化代碼的過程讓我做完了之后十分滿意,最開始的想法很簡單,但是代碼實現卻很復雜,通過一步步的簡化最終使代碼變的簡潔好看,成就感很大。但是對于我現在的水平,如果直接給我這樣的一個代碼,閱讀起來還是有些費勁的,需要多加練習。
轉載于:https://www.cnblogs.com/20135202yjx/p/4895154.html
總結
以上是生活随笔為你收集整理的20135202闫佳歆-第二章家庭作业-2.69的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么利用物联网技术提升泰山风景区的安全管
- 下一篇: 面试题37:两个链表的第一个公共结点