前提: 位操作符的操作数必须是整数
1.分类:
按(二进制)位与 &
按(二进制)位或 |
按(二进制)位异或 ^
2.按(二进制)位与 &
(1)列出 & 两边的操作数的二进制序列
(2)按对应二进制位 进行按位与
(3) 按位与的规则是: 有假则假,全真为真
(也就是 有0则0,全1为1)
3. 按(二进制)位或 |
(1)列出 & 两边的操作数的二进制序列
(2)按对应二进制位 进行按位或
(3) 按位或的规则是: 全假则假,有真则真
(也就是 全0则0,有1为1)
4. 按(二进制)位异或 ^
(1)列出 & 两边的操作数的二进制序列
(2)按对应二进制位 进行按位或
(3) 按位或的规则是: 相同为0 , 相异为1
(也就是 全0,或者全1 为0 有0 和1的为 1)
5.通过例子来理解位操作符
int a = 3;
int b =5;
(1)按位与 &
int c = a & b;
a的二进制序列: 00000000000000000000000000000011
b 的二进制序列: 00000000000000000000000000000101
按位与的结果: 00000000000000000000000000000001
(2)按位或 |
int c = a & b;
a的二进制序列: 00000000000000000000000000000011
b 的二进制序列: 00000000000000000000000000000101
按位或的结果: 00000000000000000000000000000111
(3)按位异或 ^ (有知识点补充)
int c = a & b;
a的二进制序列: 00000000000000000000000000000011
b 的二进制序列: 00000000000000000000000000000101
按位异或的结果: 00000000000000000000000000000110
知识点补充: (是做下面的面试题的关键)
1. 两个相同变量异或的值还是那个值
a ^ a 就是0了
如: int a =3;
a: 0 1 1
a: 0 1 1
a ^ a : 0 0 0
2. 0和任意一个变量异或的值,是那个非0的值
0 ^ a 还是a
如: int a =3;
a: 0 1 1
0: 0 0 0
a ^ 0 : 0 1 1
6.通过面试题来应用 位操作符
(1)题目:交换2个int变量的值,不能使用第三个变量,
即a = 3,b = 5,交换之后 a = 5,b = 3;
(2)用位操作符解答
最好先将a ^ b 赋给a
(3)其它解法
注意该种解法的缺陷:
当a + b 的值超过int型的最大值时,会出现溢出