位运算的使用

  1. 背景

​ 工作中依赖外部团队使用了位运算对数据进行了转化和存储。

​ 今天整理下关于位运算相关的内容。

  1. 位运算基础

    现代计算机中所有的数据以二进制的形式存储在设备中。即 0、1 两种状态,计算机对二进制数据进行的运算(+、-、*、/)都是叫位运算,即将符号位共同参与运算的运算。

符号描述运算规则
&两个位都为1时,结果才为1
l两个位都为0时,结果才为0
^异或两个位相同为0,相异为10^0=0 0^1=1 1^0=1 1^1=0
~取反0变1,1变0
<<左移各二进位全部左移若干位,高位丢弃,低位补0
>>右移各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)
  1. 使用场景

1) 源码中使用
位运算计算速度快。 LIst,map源码中使用。 如arrayList 扩容

在这里插入图片描述
2)状态位标识

​ 商品的属性有很多: 是否新品,是否虚拟商品,是否图书,是否支持配送,是否参加营销活动。

​ 10110; 我们可以表示 新品图书且支持配送。

​ 3)数据状态整合

​ 比如本文背景中说到的,将主类型 移位后,和子类型运算,整合成一个数值。

  1. 举个例子

    记录员工本周(月)打卡情况。
    场景: 记录员工本周(月)打卡情况。
    实现: 使用位运算-实现统计周打卡的类。

            1)签到方法;取消签到方法;统计总数;获取签到数据;查看某天是否签到等
    
            2)定义枚举,原来标识状态。本例中标识 每天的签到情况。
    
/**
* 记录周打卡的实现类
*/
public class WeekSign {

    //本周签到状态
    private static int status;

    //设置签到状态
    public static void setStatus(int status){
        WeekSign.status = status;
    }

    /**
     * 获取周签到记录
     * @return
     */
    public static String getWeeKSignRecord(){
        System.out.println("签到状态值为:"+status);
         return Integer.toBinaryString(status);
    }

    /**
     * 周签到总数
     * @return
     */
    public static int getWeeKSignRecordCount(){
        return Integer.bitCount(status);
    }

    /**
     * 添加签到 (打标)
     * @param
     */
    public static void addSign(WeekSignEnum xDay){

        if( (status & xDay.getValue()) == xDay.getValue() ){
            System.out.println(xDay.getName()+"已签到,无需重复签到");
           return;
        }
        status = status | xDay.getValue();
    }

    /**
     * 取消签到(取消打标)
     * @param xDay
     */
    public static void removeSign(WeekSignEnum xDay){

        if( (status & xDay.getValue()) != xDay.getValue() ){
            System.out.println(xDay.getName()+"未签到,无需取消签到");
            return;
        }
        //异或运算
        status = status ^ xDay.getValue();
    }

    /**
     * 判断哪天是否签到 (判断某个标识)
     * @param xDay
     */
    public  static  void  getXdayIsSign(WeekSignEnum xDay){
        if( (status & xDay.getValue()) == xDay.getValue() ){
           System.out.println(xDay.getName()+":签到了");
        }else{
            System.out.println(xDay.getName()+":缺勤");
        }
    }
   
     /**
     * 内部枚举定义
     */
    enum WeekSignEnum {

        day01Sign("周一",1),
        day02Sign("周二",2<<0),
        day03Sign("周三",2<<1),
        day04Sign("周四",2<<2),
        day05Sign("周五",2<<3),
        day06Sign("周六",2<<4),
        day07Sign("周日",2<<5);


        private String name;

        //某天签到的标记值
        private int  value;


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

        public String getName() {
            return name;
        }

        public int getValue() {
            return value;
        }
    }

}

​ 测试“签到打卡”类

 public void multiBooleanStatusBitStore() {

        //WeekSign.setStatus(WeekSign.WeekSignEnum.day01Sign.getValue() | WeekSign.WeekSignEnum.day03Sign.getValue());
        //打卡签到
        WeekSign.addSign(WeekSign.WeekSignEnum.day01Sign);
        WeekSign.addSign(WeekSign.WeekSignEnum.day02Sign);
        WeekSign.addSign(WeekSign.WeekSignEnum.day03Sign);
        WeekSign.addSign(WeekSign.WeekSignEnum.day04Sign);
        WeekSign.addSign(WeekSign.WeekSignEnum.day05Sign);
        WeekSign.addSign(WeekSign.WeekSignEnum.day07Sign);

        //重复打卡
        WeekSign.addSign(WeekSign.WeekSignEnum.day05Sign);

        //取消签到
        WeekSign.removeSign(WeekSign.WeekSignEnum.day02Sign);

        //重复取消签到
        WeekSign.removeSign(WeekSign.WeekSignEnum.day02Sign);

        //总的情况
        System.out.println("本周签到记录(二进制):" + WeekSign.getWeeKSignRecord());
        System.out.println("本周一共签到天数:" + WeekSign.getWeeKSignRecordCount());

        //判断某天 是否签到
        WeekSign.getXdayIsSign(WeekSign.WeekSignEnum.day03Sign);
        WeekSign.getXdayIsSign(WeekSign.WeekSignEnum.day05Sign);

    }

效果
在这里插入图片描述

  1. 其他

​ Q: 有 1000 个一模一样的瓶子,其中有 999 瓶是普通的水,有1瓶是毒药。现在,如果检验出哪个瓶子里有毒药,(一定时间内)最少需要几只小老鼠试毒。

   A: log2 ​1000   = 10只。

   解释:  以8瓶水为例,log2  8 = 3只。         

          将水瓶编号,将(二进制)对应位数为1的水喂给同一个小老鼠。一定时间后 看有哪些小老鼠GG了。

           如:B和C 小老鼠G了, 说明  【0 1 1】  水瓶有毒。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/102521.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Arcface部署应用实战

1、概述 人脸识别的一个比较常用的网络arcface&#xff0c;依赖于其特殊设计的loss函数&#xff0c;使得模型在训练的时候能够实现类间距离增大&#xff0c;类内的距离不断减小&#xff0c;最终使得所训练的backbone能够获取鉴别性很高的特征&#xff0c;便于人脸识别。 本文…

leetcode 2483. Minimum Penalty for a Shop(商店的最少代价)

字符串customers只包含’Y’和’N’两种字母, 表示 i 时刻商店是否有客人来。 如果商店在 i 时刻处于开门状态&#xff0c;Y’的代价是0&#xff0c;N’的代价是1.&#xff08;开门了却没有客人就算损失&#xff09;。 反之&#xff0c;在 i 时刻处于关门状态&#xff0c;N’的…

睿趣科技:开抖音小店挣钱吗到底

在当今数字化时代&#xff0c;社交媒体平台成为了创业者们寻找商机和赚钱的新途径。而抖音作为一款风靡全球的短视频分享平台&#xff0c;自然也成为了许多人开设小店、进行创业的选择之一。那么&#xff0c;开抖音小店能否真正实现盈利&#xff0c;成为了一个备受关注的话题。…

swaggo的一点小理解

如有错误&#xff0c;希望指出&#xff0c;谢谢&#xff01; 很低级的概念不清&#xff0c;大佬嘴下留情。 1.关于swag的注释 我的理解是这些注释是专门提供给Swagger UI界面测试使用的&#xff0c;根据注释内容告诉swag文档这个函数应该有哪些参数&#xff0c;从什么路由走&…

学会Mybatis框架:让你的开发事半功倍【五.Mybatis关系映射】

目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 导语 一、一对一的关系映射 1.表结构 2.resultMap配置 3.测试关系映射 二、一对多的关系映射 1.表结构 2.resultMap配置 3.测试关系映射 三、多对多的关系映射 1.表结构…

【微服务部署】一、使用docker-compose部署Jenkins、SonarQube、PostgreSQL

一、安装 1、编写docker-compose部署Postgres、SonarQube、Jenkins的yml文件jenkins-compose.yml Postgres&#xff1a;作为SonarQube的数据库存储SonarQube&#xff1a;代码质量检查Jenkins&#xff1a;jenkins/jenkins:lts镜像&#xff0c;jenkinsci/blueocean镜像缺少node…

51单片机项目(7)——基于51单片机的温湿度测量仿真

本次做的设计&#xff0c;是利用DHT11传感器&#xff0c;测量环境的温度以及湿度&#xff0c;同时具备温度报警的功能&#xff1a;利用两个按键&#xff0c;设置温度阈值的加和减&#xff0c;当所测温度大于温度阈值的时候&#xff0c;蜂鸣器就会响起&#xff0c;进行报警提示。…

C语言深入理解指针(非常详细)(二)

目录 指针运算指针-整数指针-指针指针的关系运算 野指针野指针成因指针未初始化指针越界访问指针指向的空间释放 如何规避野指针指针初始化注意指针越界指针不使用时就用NULL避免返回局部变量的地址 assert断言指针的使用和传址调用传址调用例子&#xff08;strlen函数的实现&a…

java反编译工具jd-gui使用

文章目录 一、JD-GUI介绍二、下载三、安装四、使用教程五、免责声明摘抄 一、JD-GUI介绍 JD-GUI是一个独立的图形实用程序&#xff0c;显示“.class”文件的Java源代码。 使用JD-GUI浏览重构的源代码&#xff0c;以便即时访问方法和字段。 二、下载 MAC安装包&#xff1a;ht…

链路聚合原理

文章目录 一、定义二、功能三、负载分担四、分类五、常用命令 首先可以看下思维导图&#xff0c;以便更好的理解接下来的内容。 一、定义 在网络中&#xff0c;端口聚合是一种将连接到同一台交换机的多个物理端口捆绑在一起&#xff0c;形成一个逻辑端口的技术。通过端口聚合&…

在 Spring Boot 中集成 MinIO 对象存储

MinIO 是一个开源的对象存储服务器&#xff0c;专注于高性能、分布式和兼容S3 API的存储解决方案。本文将介绍如何在 Spring Boot 应用程序中集成 MinIO&#xff0c;以便您可以轻松地将对象存储集成到您的应用中。 安装minio 拉取 minio Docker镜像 docker pull minio/minio创…

解决 .csv 文件上传到 pgsql 的字符报错问题

目录 背景问题解决办法 背景 上传 .csv 文件进行数据导入到 pg 时&#xff0c;报错显示如下&#xff1a; ods.tbl_inp_fee_detail.csv数据上传失败 报错信息:org.postgresql.util.PSQLException: ERROR: invalid byte sequence for encoding "UTF8": 0x00 Where: C…

多维时序 | Matlab实现GRU-Adaboost和GRU多变量时间序列预测对比

多维时序 | Matlab实现GRU-Adaboost和GRU多变量时间序列预测对比 目录 多维时序 | Matlab实现GRU-Adaboost和GRU多变量时间序列预测对比预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 多维时序 | Matlab实现GRU-Adaboost和GRU多变量时间序列预测对比 模型描述 M…

【python爬虫】10.指挥浏览器自动工作(selenium)

文章目录 前言selenium是什么怎么用设置浏览器引擎获取数据解析与提取数据自动操作浏览器 实操运用确认目标分析过程代码实现 本关总结 前言 上一关&#xff0c;我们认识了cookies和session。 分别学习了它们的用法&#xff0c;以及区别。 还做了一个项目&#xff1a;带着小…

Redis集群操作-----主从互换

一、将节点cluster1的主节点7000端口的redis关掉 [rootredis-cluster1 src]# ps -ef |grep redis 二、查看集群信息&#xff1a;

SpringBoot复习:(60)文件上传的自动配置类MultipartAutoConfiguration

可以看到&#xff0c;定义了一个类型为StandartServletMultipartResolver的bean 用来进行文件上传&#xff0c;定义了一个类型为MultipartConfigElement的bean用来进行上传相关的配置&#xff0c;其中使用了MultipartProperties中的属性&#xff0c;这个类的定义如下&#xff1…

Centos 6.5 升级到Centos7指导手册

一、背景 某业务系统因建设较早&#xff0c;使用的OS比较过时&#xff0c;还是centos6.5的系统&#xff0c;因国产化需要&#xff0c;需将该系统升级到BClinux 8.6&#xff0c;但官方显示不支持centos 6.x升级到8&#xff0c;需先将centos6.5升级到centos7的最新版&#xff0c…

ZDH-权限模块

本次介绍基于ZDH v5.1.2版本 目录 项目源码 预览地址 安装包下载地址 ZDH权限模块 ZDH权限模块-重要名词划分 ZDH权限模块-菜单管理 ZDH权限模块-角色管理 ZDH权限模块-用户配置 ZDH权限模块-权限申请 项目源码 zdh_web: GitHub - zhaoyachao/zdh_web: 大数据采集,抽…

高频面试题:如何分别用三种姿势实现三个线程交替打印0到100

最近面试遇到的一道题&#xff0c;需要三个线程交替打印0-100&#xff0c;当时对多线程并不是很熟悉因此没怎么写出来&#xff0c;网上搜了之后得到现 synchronized wait/notifyAll 实现思路&#xff1a;判断当前打印数字和线程数的取余&#xff0c;不等于当前线程则处于等待…

ORB-SLAM3复现过程中遇到的问题及解决办法

在复现过程中遇到的问题的解决过程 1. 版本检查1.1 Opencv版本的检测1.2 Eigen版本的检测1.3 查看Python版本1.4 其他 2. 编译过程中遇到的问题及解决办法2.1 ./build.sh遇到的问题2.2 ./build_ros.sh遇到的问题 因为环境比较干净&#xff0c;所以遇到的问题相对少一些&#xf…