位运算的一些奇特操作


        

位运算符

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/*
位运算符:
<<: 左移
>>:右移
>>>:无符号右移
&:按位与
|:按位或
^:按位异或
a ^ a = 0
a ^ 0 = a
a ^ b = b ^ a
a ^ b ^ c = a ^ (b ^ c)

~:按位取反, 单目运算符

问题:位运算能操作哪些基本类型的数据?
只能操作整数类型 (char可以看成无符号的整数)

注意事项:
位运算是运算效率最高的
^ 不是幂运算, 而是按位异或.
*/

class OpereatorDemo1 {
public static void main(String[] args) {
byte b = 1;
short s = 2;
int i = 3;
long l = 4;
float f = 5.0f;
double d = 6.0;
char c = '中';
boolean flag = false;

System.out.println(~b);
System.out.println(~s);
System.out.println(~i);
System.out.println(~l);
// System.out.println(~f);
// System.out.println(~d);
System.out.println(~c);
// System.out.println(~flag);
}
}

确定一个数是否为奇数

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*
判断一个数是否是奇数? (位运算符)
方法1:
对2取余为1的数是奇数
方法2:
最后一位是1
*/

class OpereatorDemo3 {
public static void main(String[] args) {
int a = 2019;
// System.out.println(a % 2 != 0);
System.out.println((a & 1) == 1);
}
}

结果:

1
true

求一个数对2^n的余数

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*
怎么求一个数对2^n取余。
int a = 3;
int m = 8;
System.out.println(3 % 8);

*/

class OpereatorDemo4 {
public static void main(String[] args) {
int a = 2019;
int m = 8;
System.out.println(a % m);
System.out.println(a & (m-1));

int n = 11;
System.out.println(a % n);
System.out.println(a & (n-1));
}
}

结果:

1
2
3
4
3
3
6
2

判断一个数是否是2^n次幂

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*
怎么判断一个数是否是2^n次幂
3 false
4 true
方法1:质因子只有2
log(m)
方法2:只有一位是1
m & (m-1) == 0
*/

class OpereatorDemo5 {
public static void main(String[] args) {
int m = 8;
int n = 7;
System.out.println((m & m - 1) == 0);
System.out.println((n & n - 1) == 0);
}
}

结果:

1
2
true
false

求一个数的绝对值

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static void main(String[] args) {
int n1 = -15;
int n2 = 14;
System.out.println("n1的绝对值(01):"+abNum01(n1));
System.out.println("n2的绝对值(01):"+abNum01(n2));
System.out.println("n1的绝对值(02):"+abNum02(n1));
System.out.println("n2的绝对值(02):"+abNum02(n2));
}
public static int abNum01(int num){
if(num>0)
return num;
else
return (~num)+1;
}
public static int abNum02(int num){
int i=num >> 31;
return (num^i)-i;
}

结果:

1
2
3
4
n1的绝对值(01):15
n2的绝对值(01):14
n1的绝对值(02):15
n2的绝对值(02):14

两数交换

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/*
面试题:
怎么交换两个整数?

代码:简洁易懂
*/

class OpereatorDemo7 {
public static void main(String[] args) {
int a = 4;
int b = 3;
// 方式一
/*System.out.println("a=" + a + ", b=" + b);
int temp = a;
a = b;
b = temp;
System.out.println("a=" + a + ", b=" + b);*/

// 方式二: 加法和减法互为逆运算.
/*System.out.println("a=" + a + ", b=" + b);
a = a + b; // a = 4 + 3, b = 3
b = a - b; // a = 4 + 3, b = 4
a = a - b; // a = 3, b = 4
System.out.println("a=" + a + ", b=" + b);*/

// 方法三:
/*System.out.println("a=" + a + ", b=" + b);
a = a ^ b;
b = b ^ a;
a = a ^ b;
System.out.println("a=" + a + ", b=" + b);*/

// 方式四
System.out.println("a=" + a + ", b=" + b);
// a ^= b ^= a ^= b;
// a = a + b - (b = a); // a = 4 + 3 - 4;
a = a ^ b ^ (b = a); // a = 4 + 3 - 4;
System.out.println("a=" + a + ", b=" + b);
}
}
---------------- The End ----------------

本文基于 知识共享署名-相同方式共享 4.0 国际许可协议发布
本文地址:https://philxin.top/2019/09/24/位运算的一些奇特操作/
转载请注明出处,谢谢!

0%