面試官 判斷乙個數是否為2的整數次冪

2021-09-28 07:14:31 字數 2252 閱讀 9468

postbody" class="blogpost-body ">

判斷乙個正整數是否是2的整數冪(如4是2的2次方,返回true;5不是2的整數次冪,則返回false)。要求效能盡可能高。

第一種考慮(乘法)

建立乙個中間變數temp,初始值是1,然後進入乙個迴圈,每次迴圈都讓temp和目標值進行比較,如果相等,則說明目標是2的整數次冪,

如果不相等,則讓temp乘以2,繼續迴圈比較,直到temp的值大於目標整數時,說明整數不是2的整數次冪。

比如:18

1*2=2;2比18小繼續

2*2=4;4比18小繼續

4*2=8;8比18小繼續

8*2=16;16比18小繼續

16*2=32;32比18大退出迴圈,說明18不是2的整數冪。

如果目標整數的大小是n,則此方法迴圈次數是logn。

**如下:

code">

code*******">

code_copy">

public

static

boolean is2power1(int

num)

temp = temp << 1;

//temp = temp * 2;

}return

false

; }

code*******">

codecopy">

想一想,有沒有更好的辦法?

第二種考慮(除法)

2的整數次冪都能被2整除,所以進入乙個迴圈,讓目標對2求餘,如果有餘數,則目標不是2的整數次冪,

如果沒有餘數,然後目標賦值為目標除以2,直到目標小於1,當目標小於1的時候則說明明目標是2的整數次冪。

比如:18

18%2=0;18被2整除

18/2=9;目標賦值為9

9%2=1;9沒被2整除退出迴圈,說明18不是2的整數冪。

如果目標整數的大小是n,則此方法迴圈次數有可能是1,2,3,4,...logn次。

**如下:

code">

code*******">

code_copy">

public

static

boolean is2power2(int

num)

//num = num / 2;

num = num >> 1;

}return

true

; }

code*******">

codecopy">

再想一想,有沒有更好的辦法?

第三種考慮(位運算)

讓我們看看2的整數次冪轉成二進位制是什麼樣的

十進位制二進位制

是否為2的整數次冪

81000是16

10000是32

100000是64

1000000

是100

1100100

否 是不是發現了,如果乙個整數是2的整數次冪,那麼當它轉化成二進位制時,只有最高位是1,其它位都是0!如果把這2的整數次冪各自減去1,在轉換成二進位制,會是什麼樣呢?

十進位制二進位制

原數值減1

是否為2的整數次冪

81000

111是

1610000

1111是32

100000

11111是64

1000000

111111

是100

10000000

1111111

是 是不是發現了,2的整數冪減去1時,它的二進位制數字都變成1了!如果在加上&運算子會出現什麼結果呢?

十進位制二進位制

原數值減1

n&n-1

是否為2的整數次冪

81000

1110是16

10000

11110是

32100000

111110是

641000000

1111110是

10010000000

1111111

1100000

是 怎麼樣會寫**了嗎?

**如下:

public

static

boolean is2power3(int

num)

是不是很簡單,只要動用所學過的知識點,聯絡起來,乙個問題就迎刃而解!!!

巧妙判斷乙個數是否為2的整數次冪

package main import fmt 如何判斷乙個數是否為2的整數次冪 思路1.暴力破解 從1開始乘以2,迴圈並和目標值比較,當大約目標值則終止,顯然此方法效率非常低下 思路2.把乘以2改為移位運算,提高一點效率,還是沒有解決演算法的根本問題 思路3.通過轉換成二進位制觀察,為2的整數次冪...

面試 如何判斷乙個數是否為奇數?

最開始我寫的是 return num 2 1 但發現好像忘了負數.所以改為了 return num 2 0 我以為這就解決了問題,但我習慣性檢視答案時,卻發現答案用了乙個奇怪的方法 return i 1 1 這是啥東西,冷靜下來想了一會,哦哦哦.答案是直接當做二進位制進行了運算,因為二進位制狀態下,...

判斷乙個數是否為回文數

問題描述 輸入乙個數值判斷是否為回文數 回文數是指乙個像12321 123321這樣 對稱 的數 解題思路 將數值的各個位存放在陣列中,若陣列中元素左右對稱,則為回文數,反之不是 設定 left 陣列最左邊下標 right 陣列最右邊下標 首先判斷第乙個和最後乙個數值是否相等,若相等,left ri...