基本概念
适用对象:整数类型变量(char,short,int,long等)
作用:改变二进制位
有什么用
判断某一位是否为1
只改变其中一位,其他位不变
快速计算
分类
& | 按位与(双目) |
| | 按位或(双目) |
^ | 按位异或(双目) |
~ | 按位非(取反)(单目) |
<< | 左移(双目) |
>> | 右移(双目) |
双目:两个数折腾
单目:自己折腾
按位与&
口诀:同1为1
x&1: 不变
x&0: 结果必为0
例子
21 & 18
21: 0001 0101
18: 0001 0010
16: 0001 0000
作用
某些位清零,同时保持其他位不变
最低位清零, n & 0xfe
n: 1001 0111
Oxfe: 1111 1110
1001 0110
获取变量中的某一位
获取第7位,下标从0开始
n: 1010 1010
0x80: 1000 0000
1000 0000
按位或|
口诀: 有1为1
x|1: 结果必为1
x|0: 不变
例子
21 | 18
21: 0001 0101
18: 0001 0010
23: 0001 0111
作用
某些位置为1,同时保持其他位不变
最低位置为1, n & 0x01
n: 1001 0110
Ox01: 0000 0001
1001 0111
按位异或^
口诀: 不同为1
x^1: 取反
x^0: 不变
例子
21 | 18
21: 0001 0101
18: 0001 0010
7: 0000 0111
作用
取反(~运算符可以达到同样的效果)
21 | 0xff
21: 0001 0101
oxff: 1111 1111
1110 1010
加密
如果 a^b=c,那么就有 c^b = a以及c^a=b
交换值
int a = 5, b = 7;
a = a ^ b;
b = b ^ a;
a = a ^ b;
按位非~
口诀:取反
例子
~21
21: 0001 0101
1110 1010
左移<<
口诀:高位丢弃,低位补0
例子
9 << 4
9: 0000 1001
144: 1001 0000
作用
左移n位,相当于乘以2^n
144 = 9 * 2^4 = 9 * 16
左移>>
口诀:有符号,低位丢弃,高位补符号位;无符号,低位丢弃,高位补0 (无符号,符号位相当为0)
作用
右移n位,相当于除以2^n,最后向下取整
正数
127 >> 4
127: 0111 1111
7: 0000 0111
7 = 127 / 2^4 = 127 / 16 = 7.9375
向下取整为7
负数
-127 >> 4
-127: 1000 0000
-8: 1111 1000
-8 = -127 / 16 = -7.9375
向下取整为-8,而不是-7
无符号
128 >> 4
128: 1000 0000
8: 0000 1000
8 = 128 / 8 = 8
向下取整为8
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。