玩一玩那些個二進位的東東~

來源:互聯網
上載者:User

有一位小朋友(別介意哈~)貼出了這麼一道題,某大公司面試,大概意思是這樣,對輸入的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

結束

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.