目录
简介
处理整型类型时,有一些运算符可以直接处理组成整数的各个位。这意味着可以使用掩码技术得到一个数中的各个位。
掩码:简单来说掩码就是一串二进制码。比如:00000101。就是个数字。掩码的作用是用来存储和操作“状态(State)”。
参考:什么是掩码? - 简书 (jianshu.com)
位运算符包括
- &(“and”)按位与
- |(“or”)按位或
- ^(“xor”)按位异或
- ~(“not”)取反
- >> 右移
- << 左移
按位与&
运算规则:将两边的数转换为二进制,然后进行比较运算,两个为真才为真,即两个为1才为1,其它都为0
1&1=1 , 1&0=0 , 0&1=0 , 0&0=0
简单测个代码:
public class Test {
public static void main(String[] args) {
int a = 5&4;
int b = 155&233;
System.out.println(a);//4
System.out.println(b);//137
}
}
二进制原理
5: 0 0 0 0 0 1 0 1
4: 0 0 0 0 0 1 0 0
& ----------------------
0 0 0 0 0 1 0 0 = 4
155 1 0 0 1 1 0 1 1233 1 1 1 0 1 0 0 1
& ----------------------
1 0 0 0 1 0 0 1 = 137
按位或 |
运算规则:将两边的数转换为二进制,然后进行比较运算,只要有一个为真那么结果就为真,即只要有1结果就为1
1|0 = 1 , 1|1 = 1 , 0|0 = 0 , 0|1 = 1
简单测个代码:
public class Test {
public static void main(String[] args) {
int c = 5|4;
int d = 155|233;
System.out.println(c);//5
System.out.println(d);//251
}
}
二进制原理
5: 0 0 0 0 0 1 0 1
4: 0 0 0 0 0 1 0 0
| ----------------------
0 0 0 0 0 1 0 1 = 5
155 1 0 0 1 1 0 1 1233 1 1 1 0 1 0 0 1
| ----------------------
1 1 1 1 1 0 1 1 = 251
按位异或 ^
运算规则:将两边的数转换为二进制,然后进行比较运算,异或顾名思义,所以规则为:相同为0,不同为1
1^0 = 1 , 1^1 = 0 , 0^1 = 1 , 0^0 = 0
简单测个代码:
public class Test {
public static void main(String[] args) {
int e = 5^4;
int f = 155^233;
System.out.println(e);//1
System.out.println(f);//114
}
}
二进制原理
5: 0 0 0 0 0 1 0 1
4: 0 0 0 0 0 1 0 0
^ ----------------------
0 0 0 0 0 0 0 1 = 1
155 1 0 0 1 1 0 1 1233 1 1 1 0 1 0 0 1
^ ----------------------
0 1 1 1 0 0 1 0 = 114
按位取反 ~
取反,是Java与C/C++使用补码来表示二进制数,在补码表示中,最高位为符号位,正数的符号位为0,负数为1。
运算规则:取反就是1为0,0为1
正数取反的步骤:1.取该正数的补码 2.按位取反得到负数 3.取该负数的补码;
负数取反的步骤:1.取该负数的补码 2.按位取反得到正数 3.取该正数的补码;
具体怎么搞,看下面的:
1.正数的原码、反码、补码都相同2.负数的原码:举例 -6,最左边1为符号位 1 0 0 0 0 1 1 0
3.负数的反码:原码除符号位外按位取反 1 1 1 1 1 0 0 14.负数的补码:该负数的反码+1 1 1 1 1 1 0 1 0
到此规则已经一目了然,更多请参考:(116条消息) 为什么~6 = -7_Varpb的博客-CSDN博客_6取反运算后为什么是负7
简单测个代码
public class Test {
public static void main(String[] args) {
int g = ~5;
int h = ~155;
System.out.println(g);//-6
System.out.println(h);//-156
}
}
二进制原理
5: 0 0 0 0 0 1 0 1
~ ----------------------1 1 1 1 1 0 1 0 这是得到的负数,再对除符号位外按位取反、+1
1 0 0 0 0 1 1 0 = -6
155 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 1
~ ------------------------------------------
1 1 1 1 1 1 1 1 0 1 1 0 0 1 0 0
1 0 0 0 0 0 0 0 1 0 0 1 1 1 0 0 = -156
负数取反:-6 1 0 0 0 0 1 1 0 这是-6的原码
1 1 1 1 1 0 0 1 -6的反码
1 1 1 1 1 0 1 0 -6的补码
~ ----------------------
0 0 0 0 0 1 0 1 按位取反得到正数
0 0 0 0 0 1 0 1 正数的补码和原码一样
右移 >>
顾名思义就是移位,先转换成二进制再往右移位
简单测个代码
public class Test {
public static void main(String[] args) {
int i = 13;
System.out.println(i>>2);//3
}
}
二进制原理
13: 0 0 0 0 1 1 0 1
>>2 -----------------------
0 0 0 0 0 0 1 1 = 3
右移了几位就等同于除以了("/")几次2
左移 <<
即转换成二进制后再往左移位
左移了几位就等同于乘了几次2
简单测个代码
public class Test {
public static void main(String[] args) {
int j = 9;
System.out.println(j<<3);//72
}
}