将一个int型数字转换为32bit的二进制数,因为java中的int型占4字节,32比特
如果二进制超过 33 位,不能转化为 Integer
如果二进制超过 65 位,不能转化为 Long
如果二进制超过 500000001 位,不能转化为 BigInteger
-
Long是引用类型,要比较两个Long的大小,一定要用equals而不能用==
public static void print(int num){
for(int i = 31; i >= 0; i --){
System.out.print((num & ( 1 << i )) == 0 ? "0" : "1");
}
System.out.println();
}
2的幂https://leetcode.cn/problems/power-of-two/
二进制中1的个数https://leetcode-cn.com/problems/number-of-1-bits/
十进制的相反数相当于对应二进制数取反加一
public class code01 {
public static void print(int num) {
for(int i = 31; i >= 0; i--){
System.out.print((num & (1 << i)) == 0 ? "0" : "1");
}
System.out.println();
}
public static void main(String[] args) {
int num = 1;
print(num);
int a,b,c;
//十进制的相反数相当于对应二进制数取反加一
a = 5;
System.out.println(a);
b = -a;
System.out.println(b);
c = ~a+1;
System.out.println(c);
System.out.println();
//最小数的相反数是最小数
a = Integer.MIN_VALUE;
System.out.println(a);
b = -a;
System.out.println(b);
c = ~a+1;
System.out.println(c);
}
}
异或运算:相同为0,不同为1。记为无进位相加。
异或的性质:1、N^N=0 2、N^0=N 3、满足交换率结合律
题目一:如何不用额外变量交换两个数
a = a^b -------> a = a^b b = b
b = a^b -------> a = a^b b = (a^b)^b = a
a = a^b -------> a = (a^b)^a = b
题目二:一个数组中有一种数出现了奇数次,其他数都出现偶数次, 怎么找到这种数
[a,a,a,a,b,b,b,c,c]
eof = a^a^a^a^b^b^b^c^c = b
只出现一次的数https://leetcode.cn/problems/single-number/
题目三:如何找到二进制数a最右侧的1
a&(-a) 或 a&(~a+1)
题目四:一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这两种数
[a,a,a,b,c,c,c,c,d,d]
1、先将全部数据异或,得到 eof = a^b
2、找到 eof 的最右侧1,将全部数据划分为该位为1和该位为0的两部分,a和b肯定分别处于两部分中
3、将两部分分别异或,得到a和b