Java位运算操作

基础:
1. 一个整数(都是有符号)在jvm 占用了4个字节,共32bits;
2. 最高位的bit代表符号位,0:整数;1:负数;
3. 剩余的31bits则代表数字部分;
4. 数字部分都用补码来表示
5. 原码、反码、补码的转换规则:
原码:就是数字转换为二进制后的数字;
反码:如果是正数,则反码就是原码本身;如果是负数,则将原码按位取反
补码:如果是正数,则补码就是反码本身;如果是负数,则在反码的基础上加1
6. 基于上面的原则,那么数字部分如果是正数,则数字部分就是二进制的原码;如果是负数,则数字部分是二进制的补码
7. 主要有<<(有符号左移) ,>> (有符号右移), >>>(无符号右移) ,| (或运算),&(与运算) ,~(按位取反),^(异或) 这些位操作


例子: JDK中源码中的线程池ThreadPoolExecutor里面使用了一个int字段来代表了线程池的状态和线程池的数量。

    private static final int COUNT_BITS = Integer.SIZE - 3;  // 29
    private static final int CAPACITY = (1 << COUNT_BITS) - 1; // 高3位0,低29位为1

    // runState: 高3位代表线程池的状态; 低29位代表线程的数量(线程数最多为(2^29)-1 )
    private static final int RUNNING    = -1 << COUNT_BITS; //11100000 00000000 00000000 00000000
    private static final int SHUTDOWN   = 0 << COUNT_BITS; //00000000 00000000 00000000 00000000
    private static final int STOP       = 1 << COUNT_BITS; //00100000 00000000 00000000 00000000
    private static final int TIDYING    = 2 << COUNT_BITS; //01000000 00000000 00000000 00000000
    private static final int TERMINATED = 3 << COUNT_BITS; //01100000 00000000 00000000 00000000

    private static int runStateOf(int c) {
        return c & ~CAPACITY;   // 通过取反、然后与运算,可以判断出线程池目前是什么状态
    }

    private static int workerCountOf(int c) {
        return c & CAPACITY;    //通过与运算可以算出线程数
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值