日拱一卒:位运算

2023-02-22  本文已影响0人  Tinyspot

1. 进制

二进制:0, 1
八进制:0~8
十进制:0~9
十六进制:0~9、A~F

1.1 进制转换

十进制转二进制:除 2 取余数,逆序排列

@Test
public void convert() {
    int data = 240;
    System.out.println("二进制:" + Integer.toBinaryString(data));
    System.out.println("八进制:" + Integer.toOctalString(data));
    System.out.println("十六进制:" + Integer.toHexString(data));

    System.out.println(Integer.valueOf("11110000", 2));
    System.out.println(Integer.valueOf("F0", 16));

    System.out.println(0xF0);
}

2. 位运算符

位运算符主要用来对操作数二进制的位进行运算
按位运算表示按每个二进制位(bit)进行计算

运算符 描述 运算规则
& 按位与(AND) 0&0=0   0&1=0   1&0=0   1&1=1
| 按位或(OR) 0|0=0   0|1=1   1|0=1   1|1=1
^ 按位异或(XOR) 0^0=0   0^1=1   1^0=1   1^1=0
~ 按位取反(NOT) ~1=0   ~0=1

2.1 位运算符 vs 布尔运算符

3. 位移运算符

运算符 描述 运算规则
<< 左移 左移对应的位数,高位移出(舍弃),低位的空位补零
>> 有符号右移 右移对应的位数,低位移出(舍弃),高位的空位补零
>>> 无符号右移

4. 复合位赋值运算符

运算符 描述 实例 简称
&= 按位与赋值 a &= b => a = a & b 与等于
|= 按位或赋值 a |= b => a = a | b 或等于
^= 按位异或赋值 a ^= b =>a = a ^ b
~= 按位取反赋值 a ~= b =>a = a ~ b
«= 按位左移赋值 a «= b =>a= a « b
»= 按位右移赋值 a »= b =>a = a » b

5. 位掩码(BitMask)

位掩码(BitMask),是”位(Bit)“和”掩码(Mask)“的组合词。”位“指代着二进制数据当中的二进制位,而”掩码“指的是一串用于与目标数据进行按位操作的二进制数字。组合起来,就是”用一串二进制数字(掩码)去操作另一串二进制数字“的意思

public class Mask {
    /**
     * 掩码(MASK)
     * 标识符,每个bit表示一种状态
     */
    private static int base = 1;
    // 0001
    private static int devMask = base;
    // 0010
    private static int testMask = base << 1;
    // 0100
    private static int prodMask = base << 2;

    @Test
    public void test() {
        // 0101
        int value = 5;

        // 0101 & 0001 = 0001
        boolean develop = isDevelop(value);

        // 0101 & 0010 = 0000
        boolean test = isTest(value);

        // 0101 & 0100 = 0100
        boolean prod = isProd(value);
    }

    public boolean isDevelop(int value) {
        return (value & devMask) != 0;
    }

    public boolean isTest(int value) {
        return  (value & testMask) != 0;
    }

    public boolean isProd(int value) {
        return  (value & prodMask) != 0;
    }
}
上一篇下一篇

猜你喜欢

热点阅读