位运算总结

1.位操作基础

位操作一共分为6种

符号

 描述

&      

 与

|  

 或    

^    

异或

~   

取反

<< 

左移

>> 

右移

1.1.& 按位与

两个位都为1时,结果才为1, 有0则为0

https://i-blog.csdnimg.cn/blog_migrate/6757684c60c8d284002d69750fe52c5f.png

1.2  | 按位或

两个位都为0时,结果才为0,有1则为1

https://i-blog.csdnimg.cn/blog_migrate/488f1b32c2ff543b1e0e883aa725494c.png

1.3  ^ 按位异或

不同则为0,相同则为1

https://i-blog.csdnimg.cn/blog_migrate/e71546763c424b7a2f8ead655973af8b.png

1.4 按位取反

1变0 0变1

https://i-blog.csdnimg.cn/blog_migrate/3fb9137cf7841047118db1e10bc6ebd2.png

1.5 << 左移运算符 

将a各二进制位全部左移b位后得到的值,左移越界丢弃,低位补0

例 9 << 4 =144

9的二进制形式为 0000 0000 0000 0000 0000 0000 0000 1001

9  << 4 = 0000 0000 0000 0000 0000 0000 0000 1001 0000

实际上左移以相当于乘以2,可用来开2的n次方 

1.6 >> 右移运算符

将a各二进制位全部右移b位后得到的值。溢出最右边的值就被丢弃

例 9  >> 2 = 2

9的二进制形式为 0000 0000 0000 0000 0000 0000 0000 1001

9  << 4 = 0000 0000 0000 0000 0000 0000 0000 0000 0010

实际上右移相当于除以2的n次方,向下取整

 

二.部分应用及leetcode举例

1.x & (x - 1) 用于消去x最后一位的1

x = 1100

x - 1 = 1011

x & (x - 1) = 1000

应用1. leetcode15(判断N是否是2的N次幂)

思路:如果N是2的幂次,则满足两个条件

1.N>0;

2.N的二进制只有一位1

所以可以用N&(N-1)把N中的唯一的一个1消去,如果返回0则表示是2的幂次

应用2(判断二进制中1的个数)

https://i-blog.csdnimg.cn/blog_migrate/bebfa890169866987bf8d34fa1ce45eb.png

思路: 不断用 X&(X-1)消去X的最后一位1,消去的位数则表示二进制中1的个数

2.a ^ b ^ b = a  

应用1.Leetcode136(只出现一次的数字)

思路:利用异或的特性

1.交换律 a^b^c <==>a^c^b

2.任何数异或0位任何数 

3.相同的数异或为0

例子: var a = [2,3,2,4,4]  2 ^ 3 ^ 2 ^ 4 ^ 4等价于 2 ^ 2 ^ 4 ^ 4 ^ 3 => 0 ^ 0 ^3 => 3

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值