Java之位运算

本文主要介绍了Java中位运算的相关内容,以及位运算的底层实现

位运算的介绍

java 中有 7 个位运算:

  • 按位与:&===》两位全是1,结果为1,否则为0
  • 按位或:|===》两位有一个为1,结果为1,否则为0
  • 按位异或:^===》两位一个为0,一个为1,结果为1,否则为0
  • 按位取反:~===》0->1,1->0
  • 位运算符)算术右移:>>:低位溢出,符号位不变,并用符号位补溢出的高位
  • 位运算符)算术左移:<<:符号位不变,低位补 0
  • 位运算符)无符号右移:>>>:逻辑右移也叫无符号右移,运算规则是: 低位溢出,高位补 0

特别说明:没有 <<< 符号

位运算的初步认识

public static void main(String[] args) {
    
        int a = 1 >> 2; // 1 åå³ä½ç§» 2 ä½
        int b = -1 >> 2;//ç®æ¯å³ç§»
        int c = 1 << 2;//ç®æ¯å·¦ç§»
        int d = -1 << 2;//
        int e = 3 >>> 2;//æ ç¬¦å·å³ç§»
        // a,b,c,d,e ç»ææ¯å¤å°
        System.out.println("a=" + a);
        System.out.println("b=" + b);
        System.out.println("c=" + c);
        System.out.println("d=" + d);
        System.out.println("e=" + e);
    
        System.out.println(~-2);
        System.out.println(~2);
}

java中的7 个位运算案例介绍

  • 按位与:& ===》两位全是1,结果为1,否则为0
/**
 *    10010001  (一个字节有8位。一个数代表一个bit)
 *    11110010
 *  ——————————
 *    10010000
 *
 */
  • 按位或:| ===》两位有一个是1,结果为1,否则为0
/**
  *    10010001  (一个字节有8位。一个数代表一个bit)
  *    11110010
  *  ——————————
  *    11110011
  *
  */
  • 按位异或:^ ===》两位一个为0,一个位1,结果为1,否则为0
/**
 *    10010001  (一个字节有8位。一个数代表一个bit)
 *    11110010
 *  ——————————
 *    01100011
 */
  • 按位取反:~ ===》0->1,一1->(0变为1,1变为0);
/**
 *    10010001
 * ————————————
 *    01101110
 */

其他的类似,就不一一列举了

位运算的底层推导过程

此处要回顾一下,7基本数据类型对应多占用的字节数。
byte(1byte)->char(2byte)->int(4byte)->short(2byte)->long(8byte)->double(8byte)->float(4byte)
  8bit         16bit        32bit       16bit         64bit         64bit          32bit
  • 案例1:按位&,2 & 3的推导过程
//1. 先得到2的补码==》得到2的补码前提需要得到2的原码:00000000 00000000 00000000 00000010
  //    得到2的补码(正数三码合一):00000000 00000000 00000000 00000010
  //2. 得到3的补码===》得到3的补码前提是需要得到3的原码:00000000 00000000 00000000 00000011
  //    得到3的补码(正数三码合一):00000000 00000000 00000000 00000011
  //3. 计算:
 /**
   * 按位&
   *    00000000 00000000 00000000 00000010(2的补码)
   *    00000000 00000000 00000000 00000011(3的补码)
   *  ————————————————————————————————————
   *    00000000 00000000 00000000 00000010(运算后的补码)
   *
   *    由于结果最高位位为0,所以为正数(三码合一)
   *    运算后的原码也是:00000000 00000000 00000000 00000010
   *    其结果转换为十进制:2
   */
System.out.println(2 & 3);
  • 案例2:按位取反,~-2推导过程
//1. 先得到2的原码:00000000 00000000 00000000 00000010
//2. 由于结果最高位位为0,所以为正数(三码合一),所以2的补码
//        2的补码=00000000 00000000 00000000 00000010
//3、~2操作:     11111111 11111111 11111111 11111101(运算后的补码)
//    由于结果最高位位为1,所以为负数
//    需要先根据负数的补码-1得到负数的反码,然后负数的反码符号位不变,其他位取反即可得到原码
//  运算后负数的反码:负数的补码-1==》  11111111 11111111 11111111 11111100
//4、运算后的原码(反码符号位不变,其他位取反): 10000000 00000000 00000000 00000011
//    其结果转换为十进制为:-3
// 按位或、按位异或推导过程类似。
  System.out.println(~2);
  • 案例3:算术右移:>>;低位溢出(舍去),符号位不变,并用符号位补溢出的高位
//推导过程
//1的二进制:00000000 00000000 00000000 00000001
//       ==>00000000 00000000 00000000 00000000
//   其本质:1/2/2 = 0; 
System.out.println(1>>2);
  • 案例4:算术左移:<<;符号位不变,低位补 0
//推导过程
//1的二进制:00000000 00000000 00000000 00000001
//      ==>00000000 00000000 00000000 00000010
//其本质:1*2*2 = 4;
System.out.println(1<<2);

到此为止,关于位运算底层实现已介绍完毕,这一块真正的让你明白什么是原码、补码、反码。这样才能让你真正的明白Java底层计算逻辑的执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

双木林L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值