美文网首页
日拱一卒:位运算

日拱一卒:位运算

作者: Tinyspot | 来源:发表于2023-02-22 20:14 被阅读0次

    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. 位移运算符

    • 按二进制形式把所有的数字向左(右)移动对应的位数
    • byte 和 short 会先转换为 int 再进行移位
    运算符 描述 运算规则
    << 左移 左移对应的位数,高位移出(舍弃),低位的空位补零
    >> 有符号右移 右移对应的位数,低位移出(舍弃),高位的空位补零
    >>> 无符号右移

    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;
        }
    }
    

    相关文章

      网友评论

          本文标题:日拱一卒:位运算

          本文链接:https://www.haomeiwen.com/subject/ochakdtx.html