位运算

位运算

1.位运算概述

程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理)。

110

AND 1011


0010 --> 2

——引用自百度

2.位运算运算符

与运算(&)

把参加运算的数转化为二进制(不足的位补0),按二进制位做逻辑上的与运算,1为true,0为false。

0&0=0 0&1=0 1&0=0 1&1=1

或运算(|)

把参加运算的数转化为二进制(不足的位补0),按二进制位做逻辑上的或运算,1为true,0为false。

0|0=0 0|1=1 1|0=1 1|1=1

异或运算(^)

首先异或操作是对每一位都进行异或(相同为0,不同为1),但需要先把数转换成补码才行。

1、正数的补码即本身

2、负数的补码为各位取反然后加1(最高为保持为1不变)

把参加运算的数转化为二进制(不足的位补0),两个数相同为0,相异为1。

0^0=0 0^1=1 1^0=1 1^1=0

异或的几条性质:

1、交换律

2、结合律 (ab)c == a(bc)

3、对于任何数x,都有 xx=0,x0=x

4、自反性: abb=a^0=a;

取反运算(~)

把参加运算的数转化为二进制(不足的位补0),做逻辑上的取反。

~1=0 ~0=1

左移运算(<<)

把参加运算的数转化为二进制(不足的位补0),左移若干位 (左边不要,右边补0)。

1010 << 2 就是左移两位得到 1000

若左移时舍弃的高位补包含1,则每左移一位,相当于该数乘以2。

对于int型,1<<35与1<<3是相同的,因为int总共就32位,向左边移35位的时候会取模。

右移运算(>>)

把参加运算的数转化为二进制(不足的位补0),右移若干位 (正数左边补0,负数左边补1,右边不要)。

操作数右移一位,就相当于概述除以2。

右移运算(>>>)

把参加运算的数转化为二进制(不足的位补0),右移若干位 (左边补0,右边不要)。

没有<<<运算符

3.例题

把2变成8最高效的方式是什么

2 << 2=8

判断奇偶数

二进制数的最后以为是1就是奇数,最后一位是0就是偶数,因为前面都是二的次方所以一定是偶数,所以只要判断最后一位就行了。

让被判断的数的最后的一位和1做与运算,结果为0就是偶数,为1就是奇数。

//判断奇偶数
	int num=99;
	System.out.println(num+"是:"+(((num&1)==0)?"偶数":"奇数"));
	

获取二进制位是1还是0(两种解决方案)

方案一

求x的第5位

先让1左移4位得00010000,与x进行与运算,得到的结果再右移4位判断得到的是1还是0。

//	获取二进制位是1还是0(两种解决方案)
//	方案一
	System.out.println(num +"的第5位上的二进制数是:"+(((num&(1<<4))>>4)== 0?"0":"1"));

方案二

将x右移4位与1进行与运算

// 方案二
	System.out.println(num +"的第5位上的二进制数是:"+(((num>>4)&1)==0?"0":"1") );

交换两个整数变量的值

A=A^B

B=A^B

C=A^B

不用判断语句,求整数的绝对值

负数的补码为各位取反然后加1(最高位保持为1不变)

先把要求的数设为A带符号往右移31位设为x,若A为正数那x就0,为负数则为-1(111111…第一个1表符号),将A和x做异或运算,若A为正数那么运算结果就是自己,若A为负数结果则为~A(取反),因为取反后还要加一,通过A>>>31(结果为0或1)来决定要不要加一。

//不用判断语句,求整数的绝对值
	int num1=-20;
	System.out.println(num1+"的绝对值是"+((num1^(num1 >> 31))+(num1 >>> 31)));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值