JAVA中的位运算与二进制操作

例如当前值为-1,首先我们获取绝对值1,首先是一个字节的值,也就是8个比特位,1的二进制原码为1,前面补0,则是00000001,接着我们将当前值反过来,得到反码11111110,然后对反码+1则是补码11111111,所以-1得值就是11111111。

例如-127,绝对值为127,原码为01111111,反码为10000000,补码则是10000001,其他的负数都是如此。

位运算

前面介绍了整数的二进制操作,那么在计算机操作中,往往对二进制辅以位运算,以此来达到快速运算的结果,接下来,就开始学习计算机中的位运算操作,首先将所有的位运算列出来,如下:

运算符说明
<<左移位,在低位处补0
>>右移位,若为正数则高位补0,若为负数则高位补1
>>>无符号右移位,无论正负都在高位补0
&与(AND),对两个整型操作数中对应位执行布尔代数,两个位都为1时输出1,否则0。
|或(OR),对两个整型操作数中对应位执行布尔代数,两个位都为0时输出0,否则1。
~非(NOT),一元运算符。
^异或(XOR),对两个整型操作数中对应位执行布尔代数,两个位相等0,不等1。
<<=左移位赋值。
>>=右移位赋值。

必看视频!获取2024年最新Java开发全套学习资料 备注Java

|
| >>>= | 无符号右移位赋值。 |
| &= | 按位与赋值。 |
| |= | 按位或赋值。 |
| ^= | 按位异或赋值。 |

如此多的运算,到底是如何计算的呢?

(<<)左移位

假设当前有值int a = 5,操作为5 << 3,则是对5做左移三位的操作,那么具体操作步骤是什么呢?

1.将5转为32比特位(int)的二进制,得出结果0000 0000 0000 0000 0000 0000 0000 0101

2.这个时候将整体朝左移动三位,超过三十二位的高位舍弃(少舍弃一位,留下一位作为正负数的符号位,即正数最高位补0,负数最高位补1),低位不足补0,则是0000 0000 0000 0000 0000 0000 0010 1000 ,将当前二进制转换为十进制,则是40,所以最终计算的结果为40

public class LeftMoving{
public static void main(String[] args){
int a = 5;
System.out.println(“5<<3=”+(a << 3));//5<<3=40
}
}

(>>)右移位

假设当前值int a = 5,操作为5>>1,则是对5右移1位的操作,具体步骤如下:

1.将5转为32比特位的二进制,结果为0000 0000 0000 0000 0000 0000 0000 0101

2.将整体二进制的结果右移1位,如果本身为正数,首个最高位补0,负数首个最高位补1,其他高位补0,超过的低位舍弃,结果为00000 0000 0000 0000 0000 0000 0000 010,将这个值转为十进制为2,所以最终结果为2

public class NegativeRightMoving{
public static void main(String[] args){
int a = 5;
System.out.println(“5>>1=”+(a>>1));//5>>1=2
}
}

(>>>)无符号右移

这里我们假设值int a = -5,操作为-5>>>1,操作如下:

1.原码为0000 0000 0000 0000 0000 0000 0000 0101

2.反码为1111 1111 1111 1111 1111 1111 1111 1010

3.补码为1111 1111 1111 1111 1111 1111 1111 1011

4.整体右移1位,高位补0,低位超过部分舍弃,则为0111 1111 1111 1111 1111 1111 1111 1101,转为十进制为2147483645 ,所以最终结果为2147483645

public class UnsignedRightMoving{
public static void main(String[] args){
int a = -5;
System.out.println(“-5>>>1=”+(a>>>1));//-5>>>1=2147483645
}
}

ps:一定要分清楚无符号右移和右移操作的区别,右移位运算符>>,若操作的值为正,则在高位插入0;若值为负,则在高位插入1,右移补零操作符>>>,无论正负,都在高位插入0

(&)位与运算符

假设值int a = 129,操作为129&128,具体步骤如下:

1.129转为二进制0000 0000 0000 0000 0000 0000 1000 0001,128转二进制为0000 0000 0000 0000 0000 0000 1000 0000

2.从最高位开始比较,同一位的两个值都为1则是1,否则为0,则最终结果为0000 0000 0000 0000 0000 0000 1000 0000 ,即128

public static void main(String[] args){
System.out.println(“129&128=”+(129&128));//129&128=128
}

(|)位或运算符

假设值int a = 129,操作为129|128,具体步骤如下:

1.129转为二进制0000 0000 0000 0000 0000 0000 1000 0001,128转二进制为0000 0000 0000 0000 0000 0000 1000 0000

2.从最高位开始比较,同一位的两个值有一个为1则是1,否则为0,则最终结果为0000 0000 0000 0000 0000 0000 1000 0001即129

public static void main(String[] args){
System.out.println(“129|128=”+(129|128));//129|128=129
}

(~)位非运算符

假设值为37,操作为~37,具体步骤如下:

1.37转为二进制为00000000 00000000 00000000 00100101

2.~操作是指如果每一位的值为0,则是1,如果为1,则是0,所以整体取反,结果为11111111 11111111 11111111 11011010

3.由于当前获取的结果首位为1,代表值为负数,那么我们通过当前补码计算原码,首先将补码-1得到反码,则为11111111 11111111 11111111 11011001,然后整体取反,则为00000000 00000000 00000000 00100110 ,转为10进制为38,由于是负数,则最终结果为-38

public static void main(String[] args){
System.out.println("37="+(37));//~37=-38
}

(^)位异或运算

假设当前值为8,操作为8^11,具体操作如下:

1.8转为二进制0000 0000 0000 0000 0000 0000 0000 1000 ,11转为二进制为0000 0000 0000 0000 0000 0000 0000 1011

2.^运算符则是比较每一位的值是否一致,一致为0,否则为1,所以比较的结果为0000 0000 0000 0000 0000 0000 0000 0011 ,转为十进制结果为3

public static void main(String[] args){
System.out.println("811="+(811));//8^11=3
}

(<<=)左移赋值

假设当前有值int a = 5,操作为a <<= 3,那么具体操作步骤是什么呢?

1.先将5做左移三位的操作,得出结果为40(此步骤与<<一致)

2.然后将最终结果重新赋值给a,即a为40

public class LeftMoving{
public static void main(String[] args){
int a = 5;
a <<= 3;//a = a << 3
System.out.println(a);//40
}
}

(>>=)右移赋值

假设当前值int a = 5,操作为a >>= 1,则是对5右移1位的操作,具体步骤如下:

1.首先将a按照5 >> 1的操作,得到结果为2

2.将得到的结果2赋值给a,即a=2

public class NegativeRightMoving{
public static void main(String[] args){
int a = 5;
a >>= 1; //a = a >> 1;
System.out.println(a);//2
}
}

(>>>=)无符号右移赋值

这里我们假设值int a = -5,操作为a >>>= 1,操作如下:

1.5 >>> 1的结果为2147483645

2.将结果2147483645 赋值给a,则a=2147483645

public class UnsignedRightMoving{
public static void main(String[] args){
int a = -5;
a >>>= 1;//a = 5 >>> 1 = 2147483645
System.out.println(a);//2147483645
}
}

最后

即使是面试跳槽,那也是一个学习的过程。只有全面的复习,才能让我们更好的充实自己,武装自己,为自己的面试之路不再坎坷!今天就给大家分享一个Github上全面的Java面试题大全,就是这份面试大全助我拿下大厂Offer,月薪提至30K!

我也是第一时间分享出来给大家,希望可以帮助大家都能去往自己心仪的大厂!为金三银四做准备!
一共有20个知识点专题,分别是:

Dubbo面试专题

JVM面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Java并发面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Kafka面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MongDB面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MyBatis面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MySQL面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Netty面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

RabbitMQ面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Redis面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Spring Cloud面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

SpringBoot面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

zookeeper面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

常见面试算法题汇总专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

计算机网络基础专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

设计模式专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南
NatyVj-1716453227549)]

zookeeper面试专题

[外链图片转存中…(img-aTVrjJdo-1716453227550)]

常见面试算法题汇总专题

[外链图片转存中…(img-A35EzN0Z-1716453227550)]

计算机网络基础专题

[外链图片转存中…(img-lYfg4dyb-1716453227551)]

设计模式专题

[外链图片转存中…(img-cJOMzg3a-1716453227551)]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值