20135202闫佳歆-第二章家庭作业-2.69
第二章家庭作業(yè)
選題:2.69
分值:三分
作業(yè)過(guò)程:
以下是rotate_right函數(shù)的代碼:
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; }這里用到的原理是,區(qū)分n的情況,如果是0則直接返回原值,如果不是0,就按照移位的次數(shù)控制循環(huán),每次循環(huán)只移位1位。
具體循環(huán)的實(shí)現(xiàn),是借助了一個(gè)變量為endbit,最后一位,用來(lái)保留右移一位后損失掉的那位,再通過(guò)移位使這位變成最高位,最后與x移位后的數(shù)據(jù)進(jìn)行或運(yùn)算,這樣就完成了循環(huán)右移一次的功能;共需循環(huán)右移幾次,就重復(fù)幾次這個(gè)循環(huán)。
完成的代碼如下:
#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; }實(shí)驗(yàn)運(yùn)行結(jié)果如下:
實(shí)驗(yàn)中遇到的問(wèn)題:
這個(gè)函數(shù)原型的構(gòu)造并不難,找到思路后困擾我一時(shí)的只是是用或還是與,這個(gè)很容易就能夠解決,更大的問(wèn)題在我的主函數(shù)中輸入無(wú)論如何都得不到正確的結(jié)果,后來(lái)發(fā)現(xiàn)是因?yàn)槲业妮斎胧?x12345678,我以為這個(gè)可以直接轉(zhuǎn)換為16進(jìn)制但是不可以,輸出也是十進(jìn)制,所以這導(dǎo)致了我的結(jié)果錯(cuò)誤百出,后來(lái)我通過(guò)百度發(fā)現(xiàn)了%x的方法,輸入輸出格式改為這個(gè)之后就可以方便的輸入輸出16進(jìn)制,并且在輸入之前加了提示語(yǔ)0x,就可以得出正確的結(jié)果了。
這道題本身難度不算大,我主要還是栽在了自己的粗心上,沒(méi)有注意輸入輸出格式,只想當(dāng)然的去做,吸取了這次教訓(xùn),以后的作業(yè)就不會(huì)有那么多冤枉路了。
代碼的優(yōu)化
從每次右移一位,按循環(huán)次數(shù)控制右移位數(shù),能不能擴(kuò)展成一步到位移動(dòng)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; }這樣就可以直接移動(dòng)n位了。
這里還有一個(gè)小插曲,關(guān)于開(kāi)始的左移位數(shù)是要-n還是-什么,是右移了n位,上面的左移就要減n。
然后我又想,n=0的情況能不能并進(jìn)去?代碼就變成了這樣子:
unsigned rotate_right(unsigned x, int n) {int endbit;endbit = x << (8*sizeof(unsigned)-n);x = x >> n;x = x | endbit;return x; }驗(yàn)證是可以的。
endbit作為一個(gè)中間值,是不是有點(diǎn)多余?去掉之后變成:
unsigned rotate_right(unsigned x, int n) {x = (x >> n) | x << (8*sizeof(unsigned)-n);return x; }也是可以的,更簡(jiǎn)潔了。
那么可以干脆直接用return返回:
unsigned rotate_right(unsigned x, int n) {return (x >> n) | x << (8*sizeof(unsigned)-n); }這個(gè)一步步簡(jiǎn)化代碼的過(guò)程讓我做完了之后十分滿意,最開(kāi)始的想法很簡(jiǎn)單,但是代碼實(shí)現(xiàn)卻很復(fù)雜,通過(guò)一步步的簡(jiǎn)化最終使代碼變的簡(jiǎn)潔好看,成就感很大。但是對(duì)于我現(xiàn)在的水平,如果直接給我這樣的一個(gè)代碼,閱讀起來(lái)還是有些費(fèi)勁的,需要多加練習(xí)。
轉(zhuǎn)載于:https://www.cnblogs.com/20135202yjx/p/4895154.html
總結(jié)
以上是生活随笔為你收集整理的20135202闫佳歆-第二章家庭作业-2.69的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 怎么利用物联网技术提升泰山风景区的安全管
- 下一篇: 面试题37:两个链表的第一个公共结点