今日整理:位运算符
目录
1 位运算符有哪些(概览)
符号 | 描述 | 规则 | 举例 |
& | 与 | 全1为1,有0为0 | 1 & 1 = 1 0 & 1 = 0 |
| | 或 | 有1为1,全0为0 | 1 | 1 = 1 0 | 1 = 1 0 | 0 = 0 |
^ | 异或 | 相异为1,相同为0 | 1 ^ 1 = 0 0 ^ 0 = 0 1 ^ 0 = 1 |
~ | 取反 | 0 变 1,1 变 0 | ~ 1 = 0 ~ 0 = 1 |
<< | 左移 | 各二进制位左移若干位,高位丢弃,低位补零 | 001 << 2 = 100 |
>> | 右移 | 各二进制位右移若干位,对于无符号数,高位补零;对于有符号数方法不一,有的编译器补零,有的编译器补符号位(1为负0为正) | 100 >>2 = 001 |
2 位运算符的用途
2.1 与运算符
2.1.1 清零
把一个变量与零(按位)相与,该变量会清零。
2.1.2 取指定位
因为一个二进制位与1相与就会得到它,与0相与就是0,可以让1左移指定位再与该数按位与得到指定位。
2.1.3 判断奇偶
一个数的奇偶可以用它的二进制的最低位判断,1为奇0为偶,可以用取指定位的方法取最低位就是和1相与 a & 1 = 1 表示a为奇反之偶。
2.2 或运算符
2.2.1 把一个数据的某些位设置为1
因为或运算符有1为1,把需要设置1的位置设置为1,其余为零得到一个二进制,把他和待处理数据按位或,指定位必为1.
2.3 异或运算符(重中之重)
2.3.1 翻转指定位
因为1 ^ 1 = 0,0 ^ 1 = 1,所以一个位和1异或后就会翻转,把需要翻转的位置设置1,其余位设置0得到一个二进制数,再与待处理数据按位异或,指定位会翻转。
2.3.2 交换两数
执行操作 a ^= b; b ^= a; a ^= b 后a,b两数可以交换,这是不用临时变量交换两数的首选方法
2.3.3 清空变量
a ^ a = 0 根据异或的运算原理容易理解
2.3.4 异或运算的性质
①交换律:a ^ b = b ^ a
②结合律:(a ^ b)^ c = a ^ (b ^ c)
③自反性:a ^ a = 0
④零一律:a ^ 0 = a
1 ^ 1 = 0 0 ^ 1 = 1 (翻转)
2.4 取反运算符
2.4.1 使一个数的最低位为0
a & ~1
3.什么时候该用位运算符
很多题目要求我们不能用加减乘除取模等算术运算,这时候就要用位运算符代替,加法的结果可以用 a ^ b 得到,进位可以用 a & b 得到