• 🏡
    首页
  • 📎
    归档
  • ✍
    日志
  • 🐂
    留言板
顶 峰 相 见
顶 峰 相 见

dfxj

各自努力,顶峰相见

05月
07
java

Java位运算

发表于 2020-05-07 • 被 189 人看爆

总结

  • java int 32位 4字节
  • 正数换算成二进制后的高位补0,负数的二进制高位补1
  • 右移相当于除以2取整
  • 左移相当于乘以2
  • 负数的二进制表示为其正数的二进制的补码
  • 补码=反码+1
  • 负数无符号右移,高位也是补0,负数变成正数
  • 按位异或 相同为0,不同为1

相关验证

public class BitOperator {

    public static void main(String[] args) {
        //java int 32位 4字节
        //正数换算成二进制后的高位补0,负数的二进制高位补1
        //   0000 0000 0000 0000 0000 0000 0000 0001
        //=> 0000 0000 0000 0000 0000 0000 0000 0000
        // 正数右移高位补0
        //output:0
        System.out.println(1 >> 1);


        //   0000 0000 0000 0000 0000 0000 0000 0001
        //=> 0000 0000 0000 0000 0000 0000 0000 0010
        //左移相当于乘以2
        // 正数左移低位补0
        //output:2
        System.out.println(1 << 1);


        //   0000 0000 0000 0000 0000 0000 0000 0100
        //=> 0000 0000 0000 0000 0000 0000 0000 0010
        //右移相当于除以2
        //output:2
        System.out.println(4 >> 1);


        // 无符号右移 高位补0
        //   0000 0000 0000 0000 0000 0000 0000 0001
        //=> 0000 0000 0000 0000 0000 0000 0000 0000
        //output:0
        System.out.println(1>>>1);


        //负数的二进制表示为其正数的二进制的补码
        //补码=反码+1
        //所以-1的二进制表示为
        //0000 0000 0000 0000 0000 0000 0000 0001 (1的原码) => 1111 1111 1111 1111 1111 1111 1111 1110(1的反码)+1 => 1111 1111 1111 1111 1111 1111 1111 1111
        //负数的二进制高位为1
        //   1111 1111 1111 1111 1111 1111 1111 1111
        //=> 1111 1111 1111 1111 1111 1111 1111 1111
        //output:-1
        System.out.println(-1 >> 1);


        //   1111 1111 1111 1111 1111 1111 1111 1111
        //=> 1111 1111 1111 1111 1111 1111 1111 1111
        //output:-1
        System.out.println(-1 >> 2);


        //-5的二进制表示
        //0000 0000 0000 0000 0000 0000 0000 0101 (5的原码) => 1111 1111 1111 1111 1111 1111 1111 1010(5的反码)+1 => 1111 1111 1111 1111 1111 1111 1111 1011
        //   1111 1111 1111 1111 1111 1111 1111 1011
        //=> 1111 1111 1111 1111 1111 1111 1111 1101
        //output:-3
        System.out.println(-5 >> 1);


        //负数无符号右移,高位也是补0,负数变成正数
        //   1111 1111 1111 1111 1111 1111 1111 1111
        //=> 0111 1111 1111 1111 1111 1111 1111 1111
        //output:2147483647
        System.out.println(-1>>>1);


        //& 按位与
        //   0000 0000 0000 0000 0000 0000 0000 0001 & 0000 0000 0000 0000 0000 0000 0000 0011
        //=> 0000 0000 0000 0000 0000 0000 0000 0001
        //output:1
        System.out.println(1&3);


        //| 按位或
        //   0000 0000 0000 0000 0000 0000 0000 0001 | 0000 0000 0000 0000 0000 0000 0000 0011
        //=> 0000 0000 0000 0000 0000 0000 0000 0011
        //output:3
        System.out.println(1|3);


        //^ 按位异或 相同为0,不同为1
        //   0000 0000 0000 0000 0000 0000 0000 0001 ^ 0000 0000 0000 0000 0000 0000 0000 0011
        //=> 0000 0000 0000 0000 0000 0000 0000 0010
        //output:2
        System.out.println(1^3);

        //~ 按位取非
        //  ~0000 0000 0000 0000 0000 0000 0000 0001
        //   1111 1111 1111 1111 1111 1111 1111 1110
        //output:-2
        System.out.println(~1);


    }
}

//output
0
2
2
0
-1
-1
-3
2147483647
1
3
2
-2

分享到:
Java内存模型
mysql锁分析
  • 文章目录
  • 站点概览
dfxj

trade what you see, not what you think

Github QQ Email RSS
看爆 Top5
  • 金融交易技术分析 1,247次看爆
  • Angular 变更检测 —— 它到底是如何工作的? 1,211次看爆
  • kubernetes低版本java客户端ProcessorListener容量问题 1,117次看爆
  • Angular SSR踩坑记录 1,083次看爆
  • kubernetes容器编排和调度管理 1,011次看爆

站点已萌萌哒运行 00 天 00 小时 00 分 00 秒(●'◡'●)ノ♥

Copyright © 2021 dfxj