一、& 与运算符
只有两个位值都为1,&运算的结果才是1
1 & 1 = 1;
1 & 0 = 0;
0 & 1 = 0;
0 & 0 = 0;
其它功能:
(1) 判断奇偶值:a & 1 === 0;则说明a为偶数,因为1的二进制表达为...00001,奇数的最后一位肯定是1,若a & 1 === 1;则a为奇数
(2) 判断数字是否是2的幂,(n & (n - 1)) === 0,因为是2的幂,则2进制表达为
000001
000010
000100
001000
n - 1则为1变为0,1之后的0都变为1。
(3) n & (n−1),其运算结果恰为把 n 的二进制位中的最低位的 1 变为 0 之后的结果。这也是判断数字是否是2的幂的原理,可以用这个运算优化这道算法题,只需要循环1的个数次。而不需要循环每一次。 leetcode-cn.com/problems/nu…
二、| 或运算符
只有两个位值都为0,| 运算的结果才是0
0 | 0 = 0;
1 | 0 = 1;
0 | 1 = 1;
1 | 1 = 1;
三、^ 异或运算符
两个位值相同则为0,不同则为1
其它功能:
(1) 与0异或值不变
a^0 = a
(2)与自身异或后变为0
a^a = 0
(3)异或运算满足交换律和结合律,即
a^b^a = b^a^a = b^(a^a) = b^0 = b。
根据这三个规则,力扣原题即有简便方法leetcode-cn.com/problems/si…
四、~ 非运算符
反转原来的位值
例:~000000000101 = 111111111010
五、<< 左移运算符
各位值左移n位数,左侧丢弃,右侧补0
例如:6左移两位变24
0000 0000 0000 0000 0000 0000 0000 0110 -> 6
0000 0000 0000 0000 0000 0000 0001 1000 -> 6 << 2 = 24
六、>> 右移运算符
各位值右移n位数,左侧补0或补1,正数左补0,负数左补1;
例
0000 0000 0000 0000 0000 0000 0000 1100 -> 12
0000 0000 0000 0000 0000 0000 0000 0011 -> 12 >> 2 = 3
1111 1111 1111 1111 1111 1111 1111 0100 -> -12
1111 1111 1111 1111 1111 1111 1111 1101 -> -12 >> 2 = -3
七、>>> 无符号右移
不管正负,高位补0,低位丢弃
1111 1111 1111 1111 1111 1111 1111 0100 -> -12
0011 1111 1111 1111 1111 1111 1111 1101 -> -12 >> 2 = 1073741821
最后不要把位运算符和逻辑与逻辑运算符记混,&&和||是逻辑运算符,&、|是位运算符。