跳至主要內容

BitOperator(v2.1.1)

hylexus约 357 字大约 1 分钟

BitOperator(v2.1.1)

提示

BitOperator2.1.1 中引入的辅助类。

作用

BitOperator 是位操作的工具类,目前只支持 64Bit(java.lang.Long) 的操作。

当然 BitOperator 也可以用在被 @RequestField@ResponseField@RequestFieldAlias@ResponseFieldAlias 修饰的实体类的成员变量上。

场景示例

位操作的场景都可以用到,比如下面这个场景(需要对某个 bit 操作):

以下面这条位置上报报文(2019)为例,其中的报警标志字段中 第 21(进出路线)个 bit 和第 20(进出区域)个 bit1

class BuiltinMsg0200Test extends BaseReqRespMsgTest {
    final String hex = "7E0200402D01000000000139123443210000003000000040000101CD41C2072901B00929029A005A23042821314101040000029B0202004303020309300163897E";

    @Test
    void test2019Alias() {
        final BuiltinMsg0200V2019Alias msg = decode(hex, BuiltinMsg0200V2019Alias.class);
        assertMsg(msg);
    }

    private void assertMsg(BuiltinMsg0200V2019Alias msg) {
        final BitOperator alarmStatus = BitOperator.mutable(msg.getAlarmFlag());
        // final BitOperator alarmStatus = msg.getBitOperator();
        assertEquals(1, alarmStatus.get(20));
        assertEquals(1, alarmStatus.get(21));
    }
    // ...
}

简单使用

class BitOperatorTest {

    @Test
    void testBit() {
        // 64个bit: 全是0
        final long x = 0;
        // 第 1、3、22 个 bit 被置为 1,其他位没变
        final BitOperator operator = BitOperator.mutable(x).set(1).set(3).set(22);
        assertEquals("0000000000000000000000000000000000000000010000000000000000001010", operator.binaryString(64));
        assertEquals("00000000010000000000000000001010", operator.binaryString(32));
        assertEquals("010000000000000000001010", operator.binaryString(24));

        // 第 1 个 bit 被置为 0
        final BitOperator operator1 = operator.reset(1);
        assertEquals("010000000000000000001000", operator1.binaryString(24));

        final int y = 0b11111111;
        // 第 3 个 bit 被置为 0
        assertEquals("11110111", BitOperator.mutable(y).reset(3).binaryString(8));
        // 从第 3 个 bit 开始, 连续将 2 个 bit 置为 0
        assertEquals("11100111", BitOperator.mutable(y).resetRange(3, 2).binaryString(8));

        final long z = 0b00001000;
        // z 的第 3 个 bit 是 1
        assertEquals(1, BitOperator.mutable(z).get(3));

        assertEquals(0b11, BitOperator.mutable(x).set(1).set(0).wordValue());
        assertEquals(3, BitOperator.mutable(x).set(1).set(0).wordValue());
    }
}