日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

20135202闫佳歆-第二章家庭作业-2.69

發布時間:2025/3/13 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。