下面的代码返回给定数字是否为2的幂.它是如何工作的?

kri*_*hna 0 java bitwise-operators

我可以理解它使用逐位AND运算符,但它是如何工作的?

public static void main(String[] args) {
  Scanner sc = new Scanner(System.in); 
  long num1=sc.nextLong();
  long count=(num1 & (num1- 1));
  if(count == 0l) {
    System.out.println("power of two");
  }
}
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 6

如果num是2的幂,num & (num1 -1)则为0,因为num-1将有1位num有0位,0位有num有1位.

如果num是2的幂,它有一个1位:

num           00..00100000000..00
num-1         00..00011111111..11
num & (num-1) 00..00000000000..00
Run Code Online (Sandbox Code Playgroud)

如果num不是2的幂,则至少有两个1位num.如果你检查它们中的第一个和最后一个,你得到:

num           00..001xx..xxx10..0
num-1         00.0001xx..xxx01..1
num & (num-1) 00.0001xx..xxx00..0
Run Code Online (Sandbox Code Playgroud)

所以num & (num-1)至少有1一点.