指的是1个二进制数据的每一位来参与运算
位运算的前提:是这个数必须是二进制
注意:
- 参与运算的二进制必须是补码形式
- 位运算的结果也是二进制的补码形式
按位与 &
参与按位与的两个二进制数
如果都为1 那么结果就为1
如果有一位为0 那么都为0
3&2
第一步骤 :先得到两个数的二进制补码形式。
3的补码
00000000 00000000 00000000 00000011
2的补码
00000000 00000000 00000000 00000010
-----------------------------------按位与
00000000 00000000 00000000 00000010
所以 3&2=2
任何数按位与1的结果是:是这个数的最低位
因为1的补码
00000000 00000000 00000000 00000001
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
根据 有0得0 同1得 1 所以任何数$1 任何数按位与1的结果是:是这个数的最低位
偶数的最低位一定是0.奇数的最低位一定是1
所以,如果要判断这个数是技术还是偶数 只要用这个数按位与1就可以了
如果结果为1 那么就是奇数 如果结果为0那么就是偶数
所以 代码也可以这么写
int num=10;
if((num&1)==0){
偶数
}else{
奇数
}
按位或 |
有1 得 1 否则为0
下面也不算了
按位取反 ~
单目运算符 讲这个二进制的每一位取反
~3;
3的补码: 000000000 000000000 000000000 000000011
3的取反后的补码:11111111 11111111 11111111 11111100
反码(上面的数-1) 11111111 11111111 11111111 11111011
源码 100000000 00000000 00000000 00000100
最后就是4
按位异或 ^
参与按位异或的二进制数据的位 如果相同为 不同为1
3^2;
拿到补码来运算
3补码
000000000 000000000 000000000 000000011
2补码
000000000 000000000 000000000 000000010
---------------------------------------------------------------------
000000000 000000000 000000000 000000001
结果为 1
应用场景 交换两个变量的纸 可以用异或运算
int a =3;
int b=2;
a=a^b; a=1
b=a^b; 1^2=3(下面有运算)
a=a^b; 1 ^3=2;(下面有运算)
1补码
000000000 000000000 000000000 000000001
2补码
000000000 000000000 000000000 000000010
---------------------------------------------------------------------异或后
000000000 000000000 000000000 000000011
结果为3
1补码
000000000 000000000 000000000 000000001
3补码
000000000 000000000 000000000 000000011
---------------------------------------------------------------------异或后
000000000 000000000 000000000 000000010
结果为2
按位左移运算 <<
参与俺位左移的二进制数据。向左移动指定的位数。低位不够补0 高位溢出就丢弃。
3<<2
先拿出来补码
3补码
000000000 000000000 000000000 000000011
------------------------------------------------------------------
000000000 000000000 000000000 000001100
结果是12
注意:左移可能会改变其正负性。将1个数左移n位,相当于将这个数乘以2的n次方
3<<2 3乘以2 的2次方 12
16 <<3 16*8 128
5*16 =???的写法 可以换成下面的下面的运算更快
5<<4
按位右移 >>
进制数据。向右移动指定的位数,低位溢出丢弃。高位补符号为。
参与按位右移的二
3>>2
先拿出来补码
3补码
00000000 00000000 00000000 00000011
------------------------------------------------------------------
00000000 00000000 00000000 00000000
结果是0
-16>>3
16 原码
00000000 00000000 00000000 00010000
反码
11111111 11111111 11111111 111101111
结果是-2
右移不会改变正负性
1个数右移n位相当于这个数除以2的n次方