目录
二、按位取反运算符、按位与运算符、按位异或运算符和按位或运算符
总结:
1.移位运算符:
i<<j 将操作数i的二进制数据左移j位,在最右端补0;
i>>j 将操作数i的二进制数据右移j位,若i为非负值或者无符号数,在最左端补0;
当i为负值,为了保留符号位补1还是补0是不 确定的,但一般来说是补符号位。
2.按位运算符
(1)&双1为1,其余为0
(2)|双0为0,其余为1
(3)^相同为0,其余为1或者无进位相加
(4)~遇1变0,遇0变1
一、移位运算符
移位运算符 | 含义 |
<< | 左移位 |
>> | 右移位 |
移位运算符的优先级比算术运算符的优先级低。
这两个操作符是对操作数的二进制形式进行操作。
左移位i<<就是将i的二进制数进行左移,并且在i的最右端进行补0:
可以看到此时的i的二进制中的1向左移动了一位,i从1变成了2.
右移位就是将操作数的二进制形式右移一位,如果i是无符号数或者非负值,则在i的最左端进行补0;如果i是负值,那右移后是在最左端补0还是为了保存符号位而补1是不确定的,在vs中是补符号位。
-1的二进制形式为全1
在这里我们可以发现左移可以实现*2的效果,右移可以实现/2的效果。
值得注意的是:位运算并不会改变操作数的值
我们可以看到i的值并没有发生变化。
当你想要通过位运算符改变操作数的值,有以下几种方式:
1. i=i<<j
2. i<<=j
值得注意的是:i<<2+1相等于i<<(2+1)而不是(i<<2)+1
二、按位取反运算符、按位与运算符、按位异或运算符和按位或运算符
符号 | 含义 |
~ | 按位取反 |
& | 按位与 |
^ | 按位异或 |
| | 按位或 |
其中~是一元运算符
这四个位运算符运算规则如下:
这四个运算符的优先级如下:
优先级 | 运算符 |
最高 | ~ |
& | |
^ | |
最低 | | |
位的设置、清除与检测
(1)位的设置:将i的第j位设置为1
i|=1<<j
(2)位的清除:将i的第j位设置为0
i&=~(1<<j)
(3)位的检测:检测i的第j为是否被设置为1
if(i&1<<j)
位运算符的一些使用:
1.不用创建第三变量而实现两个数的交换:
2.单身狗等问题的解决,当有一堆数字,其中数字都是成对出现,只有一个数字是单独的,找出这个数字。
3.将正数变为负数,将负数变为正数
4.统计i的二进制中1的个数
ps:无符号和有符号的补码圈:
无符号:
有符号:
三、知识点应用
1.给一个数n,确定它二进制第x位是0或者是1:
(n>>x)&1
2.将一个数n,二进制第x位修改为1:
n|=(1<<x)
3.将一个数n,二进制第x位修改为0:
n&=(~(1<<x))
4.提取一个数n二进制中最右边的1:
n&(-n)
5.干掉一个数n二进制最右边的1:
n&(n-1)