基于Java的位运算基础

位运算非常重要,之前一直懒没系统学,结果面试吃了大亏哎,
先整理一下位运算的基础知识:原码,反码,补码
在Java中,可以进行位运算的类型long,int,short,byte,char,其中64位的long,32位的int是可以直接进行位运算的,short,byte,char实际上是先转换为32位的int类型再进行位运算
原码,反码,补码的共同特点:
都是计算机中一个定点数的表达方式,都有符号位和数值位两部分,其中,符号位0表示正,1表示负。都是最高位是符号位
真值为正时,三种码都是一样的
2进制都是补码

原码

在真值的2进制表示前面加上符号位
特点
1 表示简单,易于与真值之间进行转换
2 原码进行不同符号的加法运算或者同符号的减法运算时,需要进行绝对值比较,然后进行加法运算,符号位由绝对值大的那个决定,即运算时,符号位不能直接参入运算,必须和其他位分开,这就增加了硬件开销和软件算法的复杂度,于是反码就产生了
3 绝对值相同的原码相加不为0
1 + -1 = -2
0000 0001+ 1000 0001 = 1000 0010
4 原码中0分为正0,负0
0000 0000 和 1000 0000

反码

正值等于原码,负值:符号位不变,其余位置取反
特点
1 正数与原码相同,负数,符号位不变,其余位置取反
+0:原码:0000 0000 反码:0000 0000
-0:原码:1000 0000 反码:1111 1111
2 反码中,绝对值相同的正负值相加为0
1 + -1 = -0
0000 0001 + 1111 1110 =1111 1111
3 反码中依然由+0和-0

反码是用来表示负数的,解决了原码中 绝对值相同的正负值相加不为0的问题,但是还是没有解决正负0的问题,所以没有被大规模应用,补码产生

补码

正值等于原码,负值:在其原码基础上,符号位不变,数值位取反,然后加1(即在反码基础上+1)

在计算机系统中,数值一律用补码进行计算和存储,原因在于:使用补码,能够将符号位和数值位统一处理,将加减运算 简化成 相加运算,以便于在计算机中实现各种运算,而且补码和原码之间的转换过程是相同的,不需要额外的硬件电路

特点
负值:与原码相比,从低位起,第一个1之前的0全部保留,保留第一个1,其余取反

位运算

位运算是针对二进制的每一位进行运算,专门对于0和1进行运算,因为数值在计算机中都是以二进制的方式存储的,所以位运算会节约内存和提高速度

Java 中的位运算可以分为逻辑运算符和位移运算符:
逻辑运算符可以分为:按位与&,按位或|,取反~,按位异或^
位移运算符可以分为:左移<<,右移>>,无符号右移>>>

逻辑运算符
特点:1 除了取反,都是二元运算符,
2 符号位也要参与运算的

** 按位与**
0&0=0;1&1=1,1&0=0;
基本应用:
取值:和对应数据位全为1的进行按位与,得到这个值
置零:和对应数据位全为0的进行按位与,这个值变为0
判断奇偶数:因为 a对 2的幂次方 求余==a&(2的幂次方-1),所以a%2 ==a&1

** 按位或**
0|1=1,0|0=0,1|1=1
基本应用:
给指定位赋值为1:和指定位为1,其他全0的进行按位或

取反
~1 = 0,~0=1;
基本应用:

按位异或
如果两个2进制位相同为0,如果两个2进制位不同为1
特点:
1 不进位加法:a^b = a+b 该进位的地方不进位的结果
2 任何数^自身都为0
3 任何数^0都为他本身

基本应用:
1 指定位翻转:和指定位为1的进行异或
2 数值交换:和要交换的数 先进行一次异或,结果在和自己异或,自己变成要交换的数

左移
将二进制数向左移若干位,符号位不变,高位溢出并舍弃,低位补0

基本应用:
a<<b = a*2^b

右移
将二进制数向右移若干位,符号位不变,低位溢出并舍弃,高位补0
基本应用:
a>>b = a/(2^b)

无符号右移
符号位也移,其他和右移一样
基本应用:
在ConcurrentHashMap中,判断是否需要扩容时,计算0.75a就是用a(1-a>>>2);

应用
1 求平均数:可以防止a+b时超范围
(a&y)+((a^y)>>1)
2 对于一个大于0的整数,判断是不是2的整数次方
(a&(a-1)==0 )&&(a!=0)
因为如果a是2的幂,假设a=2^3,a-1在1-3上全是1,而a在1-3全为0,则a&(a-1)=0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值