位运算与位运算符

位运算及位运算符

位运算概念:按二进制位进行的运算。
位运算符:

&按位与
l按位或
^按位异或
~取反
<<左移
>>右移

注:除~外,其他均为二元运算符,要求有两个操作数。

按位与(&)运算

运算符两边都为1,则结果为1,否则为0;
例:  0&0=0; 0&1=0; 1&0=0; 1&1=0;
用途: 一、清零。
例:将二进制数11100101的第二位清零。则可以与11111011做按位与运算。
    二、取一个数中某些指定位。
例:对二进制数11100101取后四位。则可以与00001111做按位与运算(取哪些位,
可以让哪些位与1做按位与运算)。

按位或(|)运算

运算符两边有一个为1,则结果为1.
例:  0|0=0; 0|1=1; 1|0=1; 1|1=1;

异或(^)运算符(XOR运算符)

两边相同为0,两边相异为1;
例:  0^0=0;
    0^1=0;
用途: 一、使特定位翻转。
如:二进制数01111010使第四位反转。则可与00010000进行异或运算(即与0异或不会发生改变,与1异或会发生翻转)。
    二、交换2个值,不用临时变量。
例:a=3,b=4,交换a,b的值。 则可使 a=a异或b;b=b异或a;a=a异或b。

取反运算符(~)

一元运算符,1个操作数。0变成1,1变成0;
例:求~025。 先变成二进制为00010101,取反结果为11101010。

左移运算符(<<)

将一个数的各二进制位全部左移若干位。
如:a=15,a<<2。即:将a的二进制数左移两位,右边补0。 a=15=00001111,左移后得到00111100(若高位上的一左移后溢出则舍弃)
注:左移一位相当于乘以二,但前提是溢出的高位中不包含1。

右移运算符(>>)

将一个数的各二进制位全部右移若干位。
如:a=16,a>>2。即:将a的二进制数右移两位。 a=16=00010000,右移后得到00000100。 右移一位相当于除以2。

位运算算法技巧

(1)求一个二进制中1的个数。
思路:可以让这个二进制数与这个二进制数减一做按位与运算,可求出这个二进制数中位数为1的个数。
例:

public int one(){
	int s=00101001,x=0;  
	while(s!=0){
	s=s&(s-1);
	x++
	}
	return x;
}

用到此方法的算法题: https://leetcode-cn.com/problems/number-of-1-bits/
力扣第191题,位1的个数;  以及https://leetcode-cn.com/problems/hamming-distance/力扣第461题,汉明距离。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值