测试

1111111
在这里插入图片描述

介绍

上一个礼拜和一个同事对接口,前端同事问我是不是接口文档写错了,一个订单的异常标签有多个,不应该返回一个数组吗?为啥只返回了一个数字。

因为这个接口是调用别微服务,所以我也很疑惑,找同事确认,他只回了我一句用位表示状态。我立马就懂了,因为Linux下的权限也是这么干的,然后找到他们的代码确认了一番,果然和我想的一样,看看是怎么做的吧

在这里插入图片描述
其实很简单,就一个如下的枚举类

public enum EXTEND_FLAG_ENUM {

    OVER_WEIGHT(1, "超重"),
    OVER_CUBAGE(1 << 1, "超方"),
    LATE(1 << 2, "晚点"),
    SLOW(1 << 3, "缓行");

    public int value;
    public String name;

    EXTEND_FLAG_ENUM(int value, String name) {
        this.value = value;
        this.name = name;
    }

    public static int addFlag(int org, EXTEND_FLAG_ENUM newFlag) {
        return org | newFlag.value;
    }

    public static int removeFlag(int org, EXTEND_FLAG_ENUM oldFlag) {
        return org & (~oldFlag.value);
    }
    public static boolean hasFlag(int org, EXTEND_FLAG_ENUM oldFlag) {
        return (org & oldFlag.value) > 0;
    }
}

用4个二进制为来表示订单的状态

二进制代表状态十进制
0001超重1
0011超重,超方3
1011超重,超方,缓行11
1111超重,超方,晚点,缓行15

简单解释一下与或非操作

与操作(有0出0,全1出1)

数字二级制
A1 0 1 0
B1 1 0 0
A & B1 0 0 0

或操作(有1出1;全0出0)

数字二级制
A1 0 1 0
B1 1 0 0
A | B1 1 1 0

非操作(有1出0;有0出1)

数字二级制
A1 0 1 0
~A0 1 0 1

以下断言测试通过

@Test
public void showTest() {
	// 订单的异常标签初始为0
	int extendFlag = 0;
	// 标记订单超重
	extendFlag = EXTEND_FLAG_ENUM.addFlag(0, EXTEND_FLAG_ENUM.OVER_WEIGHT);
	assertTrue(EXTEND_FLAG_ENUM.hasFlag(extendFlag, EXTEND_FLAG_ENUM.OVER_WEIGHT));
	// 标记订单超方
	extendFlag = EXTEND_FLAG_ENUM.addFlag(extendFlag, EXTEND_FLAG_ENUM.OVER_CUBAGE);
	// 订单确实超重和超方了
	assertTrue(EXTEND_FLAG_ENUM.hasFlag(extendFlag, EXTEND_FLAG_ENUM.OVER_WEIGHT));
	assertTrue(EXTEND_FLAG_ENUM.hasFlag(extendFlag, EXTEND_FLAG_ENUM.OVER_CUBAGE));
}

前端拿到一个整数就能解析出相应的状态

@Test
public void showTest2() {
	// [1]
	System.out.println(getExtendFlag(1));
	// [1, 2, 8]
	System.out.println(getExtendFlag(11));
	// [1, 2, 4, 8]
	System.out.println(getExtendFlag(15));
}

public List<Integer> getExtendFlag(int num) {
	List<Integer> numList = new ArrayList<>();
	int temp = 1;
	while (temp < 16) {
		if ((num & temp) >= 1) {
			numList.add(temp);
		}
		temp = temp << 1;
	}
	return numList;
}

你看,一个数字同时记录多种状态,节省数据库字段和带宽,程序可扩展性也变强了,增加新的状态只需要增加一个枚举属性即可。
在这里插入图片描述

二进制的其他骚操作

普通操作骚操作
n * 2n << 1
n / 2n >> 1
n % 1 == 1n & 1 == 1

没别的,位操作就是快

判断一个数是否是2的指数,我原来面试的时候被问到过

bool isPowerOfTwo(int n) {
    if (n <= 0) return false;
    return (n & (n - 1)) == 0;
}

2的指数二进制的形式一定是1000,2的指数-1的二进制的形式一定是111,所以与操作一定是0

二进制的骚操作还有很多,但是并不常用,这里只列举了一些常用的

欢迎关注

在这里插入图片描述

参考博客

一些有趣有用的位操作
[1] https://mp.weixin.qq.com/s/Z37PpJ5ZuK3pwEvaFuBxBg

技巧总结位运算装逼指南
[2] 222222222222222222222222

资源下载链接为: https://pan.quark.cn/s/c705392404e8 在本项目中,我们聚焦于“天池-零基础入门数据挖掘-心跳信号分类预-EDA分析全过程-代码.rar”这一主题。该压缩包涵盖了一次针对心跳信号分类预的数据挖掘实践,涉及数据的初步探索性分析(Exploratory Data Analysis, EDA)以及相关代码。 “天池”通常指阿里巴巴天池大数据竞赛平台,这是一个提供各类数据竞赛的平台,旨在助力数据科学家和初学者提升技能并解决实际问题。此数据挖掘任务可能是一项竞赛项目,要求参赛者对心跳信号进行分类预,例如用于诊断心脏疾病或监健康状况。EDA是数据分析的关键环节,其目的是通过可视化和统计法深入了解数据的特性、结构及潜在模式。项目中的“task2 EDA.ipynb”很可能是一个 Jupyter Notebook 文件,记录了使用 Python 编程语言(如 Pandas、Matplotlib 和 Seaborn 等库)进行数据探索的过程。EDA 主要包括以下内容:数据加载,利用 Pandas 读取数据集并检查基本信息,如行数、列数、缺失值和数据类型;描述性统计,计算数据的中心趋势(平均值、中位数)、分散度(差、标准差)和分布形状;可视化,绘制直图、散点图、箱线图等,直观呈现数据分布和关联性;特征工程,识别并处理异常值,创建新特征或对现有特征进行转换;相关性分析,计算特征之间的相关系数,挖掘潜在关联。 “example.html”可能是一个示例报告或结果展示,总结了 EDA 过程中的发现,以及初步模型结果,涵盖数据清洗、特征选择、模型训练和验证等环节。“datasets”文件夹则包含用于分析的心跳信号数据集,这类数据通常由多个时间序列组成,每个序列代表一个个体在一段时间内的 ECG 记录。分析时需了解 ECG 的生理背景,如波
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值