搬家blog──一個很牛叉又有點繞的演算法

來源:互聯網
上載者:User

在bccn上看到的一個問題和一個非常精妙的演算法。

問題是這樣的:從鍵盤上輸入一個數,判斷這個數是不是2的n次冪。

演算法是利用了位元運算,直接對二進位進行操作/判斷。

 

代碼如下:

#include <stdio.h><br />int main(void)<br />{<br />int x;<br />while( (scanf("%d", &x)) == 1)<br />{<br />if ( (x & (x-1)) ==0 ) /*精華部分*/<br />puts("Yes!");<br />else<br />puts("No!");<br />}<br />return 0;<br />}

 

感想:一看到這個問題我就想到C primer plus裡講過的位元運算。可以輕鬆實現乘以2的n次冪或除以2的n次冪。應該與這個有關。

 

看完代碼後,發覺我的思路還是對的,應該直接用二進位來進行判斷。

 


過, 這個演算法是非常巧妙。至於說它繞,是因為凡是2的n次冪的二進位都只有1個1 。如2,00000010;4,00000100;8,00001000;……而相應的,(x-1)的值恰好是後面幾位全為1,並且比x少一位。如
1,00000001;3,00000011;7,00000111;……這樣取位與&就剛好沒有一位是兩者均為1的。這樣就達成判斷了。而這個如果沒列舉一下可能就看不出來了,也就
是說可能想不出這樣的演算法了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.