2020-11-29位运算

位运算的使用

对于位运算的使用,之前一直不大重视,遇到了几道题,如果使用位运算的话,思路清晰,效率很高,非常直观。。
&, | ,^ ,~
<< 左移运算,向左进行移位操作,高位丢弃,低位补 0, >>右移运算,向右进行移位操作,对无符号数,高位补 0,对于有符号数,高位补符号位.
unsigned int a = 8;
a >> 3;
移位前:0000 0000 0000 0000 0000 0000 0000 1000
移位后:0000 0000 0000 0000 0000 0000 0000 0001

int a = -8;
a >> 3;
移位前:1111 1111 1111 1111 1111 1111 1111 1000
移位前:1111 1111 1111 1111 1111 1111 1111 1111

①&运算判断奇偶数
if(a&1) //a为奇数 否则 a为偶数
②异或运算交换两数的值

//交换a 和 b的值
a ^= b;
b ^= a;;
a ^= b;;

异或操作:n^0 = n
n^n = 0
③位操作交换符号
~a+1;
整数取反加1,正好变成其对应的负数(补码表示),负数取反加1,正好变成其原码,即对应的整数
④位操作求绝对值
整数的绝对值是其本身,负数的绝对值正好可以对其进行取反加一求得,即我们首先判断其符号位(整数右移 31 位得到 0,负数右移 31 位得到 -1,即 0xffffffff),然后根据符号进行相应的操作。

int abs(int a){
	int i = a>>31; 
	//先判断a是正还是负 如果a为正 则 i=0 
	//如果a为负 则a=0xFFFFFFFF 即为-1
	return ((a^i)-i);
}

⑤位操作进行高低位交换
给定一个16位的无符号整数,将其高8位与低8位进行交换,并求出交换后的值。。
只要将无符号数 a>>8 即可得到其高 8 位移到低 8 位,高位补 0;将 a<<8 即可将 低 8 位移到高 8 位,低 8 位补 0,然后将 a>>8 和 a<<8 进行或操作既可求得交换后的结果。

unsigned short a = 34520;
a = (a<<8)|(a>>8);

⑥位操作统计二进制中1的个数
统计二进制1的个数可以分别获取每个二进制位数,然后再统计其取1的个数,效率较低。。。每进行一次 a&(a-1)的运算,a中就少了一个1.。。。

count = 0  
while(a){  
  a = a & (a - 1);  
  count++;  
}  


1n位的0/1状态来表示一个由1n组成的集合,也就是第k位为1则代表数k在集合中,于是为了提高效率就有了各种花式枚举集合的方法:要求集合中不能有两个相邻的元素if ((mask >> 1) & mask) continue

leetcode: 89 格雷编码
①回溯枚举时,使用移位运算和异或运算
②利用格雷编码的性质,用到位运算

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值