1. 程式人生 > >java 判斷一個數是否是2的整數次冪

java 判斷一個數是否是2的整數次冪

有一道演算法題是這樣的,求一個數是否是2的整數次冪。
剛開始我的演算法是這樣寫的:
讓這個數每次都除以2,然後再乘以2,看這兩個數是否相等,不相等就返回false。放在迴圈裡面讓它從頭除到尾。

publicboolean isPower(int number){
        
if (number <2){
            
returnfalse;
        }
else{
            
int temp =0;
            
while (number >1){
                temp 
= number /2;
                
if (temp *2!= number){
                    
returnfalse;
                }
else{
                    number 
= temp;
                }

            }
returntrue;
        }

    }

用這種思維寫應該是正常的,可能大多數第一反應都會這麼想,但是稍微想想,也可以改進一下,把乘除運算換成移位運算:

publicboolean isPower(int number) {
        
if (number <2) {
            
returnfalse;
        } 
else {
            
int temp =0;
            
while (number >1) {
                temp 
= number >>1;
                
if (temp <<1!= number) {
                    
returnfalse;
                } 
else {
                    number 
= temp;
                }
            }
            
returntrue;
        }
    }

這種寫法看似優化了,但是總覺得有迴圈在裡面不夠優化,一次一次的移,不如一次就移到位,不用加迴圈在裡面,把十進位制數轉化成2進位制數:

publicboolean isPower(int number) {
        
if (number <2) {
            
returnfalse;
        } 
else {
            String strNum 
= Integer.toBinaryString(number);
            
int length = strNum.length() -1;
            
int temp = number >> length;
            
if (temp << length != number) {
                
returnfalse;
            } 
else {
                
returntrue;
            }
        }
    }

如果有前面的思維,那麼也可以這樣寫:

publicboolean isPower(int number) {
        
if (number <2) {
            
returnfalse;
        } 
else {
            String temp 
= Integer.toBinaryString(number); if (temp.lastIndexOf('1') !=0) {
                
returnfalse;
            } 
else {
                
returntrue;
            }
        }
    }


因為一個數如果是2的整數冪,那麼它的2進製表示裡面肯定只有一個1, 並且是最高位,當然不考慮負數。