有一位小朋友(別介意哈~)貼出了這麼一道題,某大公司面試,大概意思是這樣,對輸入的unsigned int數值進行二進位逆位操作,即最高位與最低位交換,次高位與次低位交換,比如:7(0000 0111) 輸出224(1110 0000)?
原文參考點擊開啟連結,我在49樓做了回複,但是擔心以後找不到,所以在這裡重囉嗦一遍,不違反相關規定吧?
很佩服那邊4樓的大牛,所以也貼一下他的代碼,謝謝咯~
unsigned char source = 7;unsigned char target = 0; for (int op = 0x80; source != 0; op /= 2){ (source & 0x01) ? target = (target | op) : target; source = source > > 1;} cout < < (int)target < < endl;// 以上是lz不知道8位還是32位的
牛人就是牛人,代碼乾淨利落,人看起來美觀,機器執行起來效率也高。
My Code就不能和牛人的相比了,不過還是貼一下吧,慰藉一下自己 :
/*相關提示:取數置零 與&某位 或|替換取反 異或^*///本題思路:取最低位,目標左移,原數右移,直至機器位元結束unsigned int transfer(unsigned int x){unsigned int y=0;unsigned int temp=0;for ( unsigned int i=1;i<=128;i<<=1)//在這裡設定機器的字長,128(0x80)是8個二進位位的機器{y=y<<1;//左移temp=x&1;//取x的最低位if (temp==1)//若是1,就“或”一下{y=y|temp;}x=x>>1;//原數右移}return y;//注意:y先左移,然後取最低的那位;否則就取不到最低的那位。}
調用語句
cout<<"transfer(7)= "<<transfer(7)<<endl; //224
cout<<"transfer(224)= "<<transfer(224)<<endl; //7
其實吧,這道題是書上的,相關資訊如下:
C和指標,(美)Kenneth A.Reek著,徐波譯,人民郵電出版社,2007
----------------------本題是P89的第3題,原題為----------------------
請編寫函數 unsigned int reverse_bits(unsigned int value);
這個函數的傳回值是把value的二進位位元模式從左至右變換一下之後的值。例如,在32位機器上,25這個值包含下列各個位:
0000 0000 0000 0000 0000 0000 0001 1001
函數的傳回值應該是2 550 136 832,它的二進位位元模式是:
1001 1000 0000 0000 0000 0000 0000 0000
編寫函數時要注意不要讓它依賴於你的機器上整型值的長度
----------------------題目完畢----------------------
----------------------作者給的答案----------------------
對位的技術不使用寫入程式碼,可以避免可移植性問題。這個解決方案使用一個位在一個不帶正負號的整數中進行移位來控制建立答案的迴圈。
/***在一個不帶正負號的整數值中翻轉位的順序*/unsigned int reverse_bits(unsigned int value){unsigned int answer;unsigned int i;answer=0;/***i不是0就繼續進行。這使迴圈與機器的字長無關,從而避免了可移植性問題*/for (i=1;i!=0;i<<=1){/***把就的answer左移1位,為下一個位留下空間**如果value的最後一位是1,answer就與1進行OR操作**然後將value右移至下一個位*/answer<<=1;if (value&1)answer|=1;value>>=1;}return answer;}
----------------------作者給的答案,結束----------------------
調用語句
cout<<"reverse_bits(25)= "<<reverse_bits(25)<<endl; //2550136832
cout<<"reverse_bits(2550136832)= "<<reverse_bits(2550136832)<<endl; //25
結束