数本身,
1. 取反 ~
2. 加1 +
3. 与本身 &
num & (~num +1)
余下的数:
n = (n & n - 1) n & = n-1
或者
n = n - (n & (~n + 1)) n —= n & (~n+1)
package com.leetcode.tricks;
/**
* 取出数中的最右侧的1,截断的后续数
*
* @description:
* @author:1252319301
* @version:
* @date: 2022年5月15日
*/
public class MostRightOne {
/**
* @description: 取出最右侧1及之后的数
* @param num
* @return
*/
public static int mostRightOne(int num) {
// 1010 取反 0101 加1 0110
// 0110 相&
// 0010 return
return num & (~num + 1);
}
/**
* @description: 去掉最右侧的一,后的数
*
* n = n - (n &(~n+1)); n = n & n-1;
* @param num
* @return
*/
public static int withoutMostRightOne(int num) {
// n = n & n-1;
// n = n - (n &(~n+1));
// 证: n & n-1 == n - (n &(~n+1));
num &= num - 1;
return num;
}
public static void main(String[] args) {
int num = 1234;
System.out.println("在十进制中,num = " + num);
System.out.println("在二进制中,num = " + Integer.toBinaryString(num));
int rightOne = mostRightOne(num);
System.out.println("在十进制中,rightOne = " + rightOne);
System.out.println("在二进制中,rightOne = " + Integer.toBinaryString(rightOne));
// -- for test
int n = 101;
System.out.println((n & n - 1) == (n - (n & (~n + 1)))); //true
}
}
在十进制中,num = 1234
在二进制中,num = 10011010010
在十进制中,rightOne = 2
在二进制中,rightOne = 10