位运算符功能学习

178 阅读2分钟

一、& 与运算符
只有两个位值都为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

最后不要把位运算符和逻辑与逻辑运算符记混,&&和||是逻辑运算符,&、|是位运算符。