二进制截取,二进制取位+长度、第几位 长度多少

取位不是字符串从左往右,而是从右往左

效果: 

二进制值: 10001100110

截取:第6位 长度4  = 10001 1001 10  = 1001

用java实现的哈,其他语言应该也差不多;

   /**
     * 截取二进制值
     *
     * @param binary   二进制值
     * @param offset   截取起始位
     * @param quantity 长度
     * @return 值
     */
    public static int subBinary(int binary, int offset, int quantity) {
        // 公式: ((value & ((1 << offset) - 1))) >> (offset - quantity))

        // 获取一个【截取起始位】长度的 【1】二进制值
        // 例子: 1<<4 =  10000 -1 = 1111;
        int offsetBinary = (1 << offset) - 1;
        // 获取需要截取的部分 &:同位都是1=1,1&1 = 1 、1&0=0;。使用 & 符号配合offsetBinary 就可以获取出offset长度的值
        // 例子: 10110110 & 1111 = 0110
        int res = binary & offsetBinary;
        // 使用 >> 去掉超过长度的值
        // 例子:quantity = 1 取出一个
        // 0110 >> (4 - 1) = 0
        return res >> (offset - quantity);
    }

用到的二进制运算符,可以去百度了解一下。

这种代码有什么应用场景呢,我是用在设备对接时返回的开关类数据用一串二进制统一返回了。某某开关值就是对应的那个二进制下标值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值