位运算

指的是1个二进制数据的每一位来参与运算

位运算的前提:是这个数必须是二进制

 注意:

  1. 参与运算的二进制必须是补码形式
  2. 位运算的结果也是二进制的补码形式

按位与 &

参与按位与的两个二进制数

如果都为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次方

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安果移不动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值