2014-12-02 46 views
-4

//目標:覈實64位輸入是2.如果數功率不是2的冪,找到以前的值,這是使用命名空間2.查找2之前的功率

功率性病;

INT主要(){

//Input. 64 bit number 
unsigned long long int input = 13174607262084689114; 

//Check number is power of two. 

if (!((input && (input & (input - 1))) == 0)) { 

    cout<<"The number is not Power of 2"<<endl; 

    //Find the previous value of input, which should be power of 2. 

    //Step 1 : Find the Next power of 2 for the input. 
    //Step 2 : divide the number by 2 

    /*End*/ 

    // Step 1  
    input |= input >> 1; 
    input |= input >> 2; 
    input |= input >> 4; 
    input |= input >> 8; 
    input |= input >> 16; 
    input |= input >> 32; 
    input = input + 1; // input holds next number , power of 2. 

    // Step 2 
    input = input >> 1; 

    cout<<"Power of 2: 64 bit: "<<input<<endl; 

} 

return 0; 

}

+4

代碼中沒有循環。除非你的標準庫被打破,以至於在試圖打印某些數字時它會掛起,我沒有看到在任何條件下代碼可能會有無限循環。 – hobbs 2014-12-02 00:28:55

+0

ideone.com編譯並運行它,並說這個數字不是2的冪 2的冪:64位:0 – pm100 2014-12-02 00:42:12

+2

我想知道它是如何編譯的:代碼有2個{'''但只有一個'}'。 – n0rd 2014-12-02 00:47:31

回答

1
(!((input) && (input & (input - 1))) == 0) 

這應該是

(!(input && (input & (input - 1)) == 0)) 
0

您的代碼顯得有些混亂。如果你只是想獲得一個最接近的小於或等於數是2的冪,這樣做是爲了簡單地計算在二進制的數字,然後轉移1回一個辦法:

//assuming x is a positive number 
long long closest_pow2(long long x) 
{ 
    int c = -1; 
    while (x) 
    { 
      x >>= 1; 
      c++; 
    } 
    return ((long long)1) << c; 
} 

您可能希望檢查零,如果x可以爲零。

+0

通過我的代碼,我得到的答案爲零....這是錯誤的。我會嘗試你的想法。 – Sudhan 2014-12-03 04:00:50