【Java】位运算判断2的N次幂
思考
如何判斷一個(gè)數(shù)是不是2的N次冪?
難道要一直除下去?一直乘過(guò)去?還是打表?
我們就不能簡(jiǎn)單一些處理這個(gè)問(wèn)題嗎?
那就有了這篇博客的內(nèi)容——位運(yùn)算判斷一個(gè)數(shù)是不是2的N次冪……
核心算法
其實(shí)就是:(num & num-1) == 0
&表示按位取且,運(yùn)算規(guī)律是(在二進(jìn)制的情況下):
- 1 & 1 = 1
- 1 & 0 = 0
- 0 & 1 = 0
- 0 & 0 = 0
Java編程實(shí)現(xiàn)
private static boolean isPowOfTwo(int num) {return (num & num-1) == 0; }算法正確性
我們把一個(gè)十進(jìn)制的數(shù)當(dāng)成二進(jìn)制來(lái)看。
Q:2的N次冪的二進(jìn)制有什么特點(diǎn)?
先枚舉一些例子:
1 → 00000001
2 → 00000010
4 → 00000100
8 → 00001000
……
A:二進(jìn)制表示的情況下只有一位(非最高位)是1。
我們不加以形式化地證明一下:
假設(shè)不是2的N次冪,這個(gè)數(shù)起碼就要比2大(我們只考慮正整數(shù)),至少也是00000011(8位二進(jìn)制表示),那么非0的就不止1個(gè),至少2位非0。
那么對(duì)于num-1,一定不會(huì)去到最高位非0位去“借位”,所以最高非0位一定不変,還是1。
既然我們按位取且,所以num & num-1(注意位運(yùn)算的優(yōu)先級(jí)弱于加減,可以這么寫(xiě)而不加括號(hào))至少會(huì)在num原先的最高非0位保持1,(因?yàn)?&1=1),這樣的結(jié)果就不可能是0(因?yàn)?是00000000)。
所以我們就能發(fā)現(xiàn),只有在num是2n(0≤n, n∈N+)的情況下,(num & num-1) == 0為真。
完整代碼
import java.util.Scanner;public class JudgePowOfTwo {private static boolean isPowOfTwo(int num) {return (num & num-1) == 0;}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int num = scanner.nextInt();scanner.close();System.out.println(isPowOfTwo(num));}}2021.3.24更新
如果是考慮到0的話,應(yīng)該這么寫(xiě):((num!=0)&&(num&num?1))==0((num!=0)\&\&(num\&num-1))==0((num!=0)&&(num&num?1))==0
總結(jié)
以上是生活随笔為你收集整理的【Java】位运算判断2的N次幂的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 理解 C++ 的 Memory Orde
- 下一篇: 【VB.NET】VB.NET数据库技术问