首页 > 编程语言 >关于一个BitMap的算法理解

关于一个BitMap的算法理解

时间:2023-09-19 10:22:05浏览次数:52  
标签:System BitMap println 算法 理解 words 128 size

  最近在看算法,想学习一下算法这玩意,虽然工作中很少用到。在《小灰的算法之旅》这本书中,有一个关于BitMap的算法。

   早期接触过一点类似的,有人在数据库里面保存了一个字符串   000000000000000000,000000000001000001,这种,每一位代表一个含义,比如第一位为1表示这个用户是上海用户,第二位为1表示星级客户,第三位为1表示有借贷,第四位为1表示有信用卡,等等,每一位是一个标志信息。

  代码如下,注释已经很明显的标注了,当然也可以用128位的数组表示等都行,主要是标志位,同时表示标志位的含义。

class Solution {

    private long[] words;

    private int size;

    /**
     * 下面算法就是相当于声明128位都是00000000的二进制,
     * 如果某一位上有值则设值为1,
     * 就相当于linux中设置权限   7代表  rwx  111
     *                       6代表   rw_  110
     *                       5代表   r_x  101
     *                       4代表   r__  100
     *                       3代表   _wx  011
     *                       2代表   _w_  010
     *                       1代表   __x  001
     *                       0代表   ___  000
     *   每一位数字上0表示无权限,1表示有权限
     *
     *   下面算法是一样的,只不过是用128位来表示
     * @param size
     */
    public Solution(int size){
        this.size = size;
        this.words = new long[(getWordIndex(size-1)+1)]; //初始化后值都是0,相当于二进制为[0000,0000]
    }

    public boolean getBit(int bitIndex){
        int wordIndex = getWordIndex(bitIndex);
        return (words[wordIndex]&(1L<<bitIndex))!=0;//此处相当于判断某一位上是否是1,如果是说明设值了
    }

    public void setBit(int bitIndex){
        int wordIndex = getWordIndex(bitIndex);
        //把 1 左移 bitIndex 位   相当于  00001左移 bitIndex位,保证某位上是1
        words[wordIndex] |= (1L<<bitIndex);

        /**
         * bitIndex为0   word[0] = 1
         * bitIndex为1   word[0] = 10
         * bitIndex为2   word[0] = 100
         * bitIndex为3   word[0] = 1000
         *
         * bitIndex为64  word[1] = 1
         * bitIndex为65  word[1] = 10
         * bitIndex为66  word[1] = 100
         * bitIndex为67  word[1] = 1000
         *
         * 上述用的是  或 操作,
         * 所以如果我设值bitIndex=0,再bitIndex为1  那么  word[0] = 11
         * 如果我设值bitIndex=0,再bitIndex为3  那么  word[0] = 1001
         */
    }

    private int getWordIndex(int bitIndex){
        //把 bitIndex 右移 6位,相当于除以64
        return bitIndex>>6;
    }

    private void printWords(){
        for (long word : words) {
            System.out.println(Long.toBinaryString(word));
        }
    }

    public static void main(String[] args) {
        
            Solution s= new Solution(128); //下面数字设值不能超过128, 即范围为 [0,128)
            s.setBit(65);
//            s.setBit(75);
//            s.setBit(36);
//            s.setBit(41);

            s.printWords();

//        System.out.println(s.getBit(126));  // false
//        System.out.println(s.getBit(78)); //false
//        System.out.println(s.getBit(36)); //true

    }
}

 

标签:System,BitMap,println,算法,理解,words,128,size
From: https://www.cnblogs.com/weiyanei/p/17713919.html

相关文章

  • 对于Istio网络路由链路的理解
    背景最近在看Istio的网络配置,对于里面的几个组件如ingress-gateway、Gateway、VirtualService、DestinationRule和k8s原生的Service间的关系不是很清楚,这里整理以下自己的理解组件这里可能陈述不完全正确,属于个人理解ingress-gateway:本质是一个Service,仍然是k8s原有组件,在......
  • 代码随想录算法训练营第十一天
    代码随想录算法训练营第十一天|LeetCode239(滑动窗口最大值)LeetCode347(前K个高频元素)239:滑动窗口最大值LeetCode239(滑动窗口最大值)importjava.util.Deque;importjava.util.LinkedList;classSolution{publicint[]maxSlidingWindow(int[]nums,intk)......
  • 流形-流形学习算法
      流形是指连在一起的区域:是一组点的集合,且每个点都有邻域。(也就意味着流形中某个元素可以通过某种方式移动到其邻域位置)  在机器学习中,我们允许流形的维数从一个点到另一个点有所变化。(这通常发生在流形与自身相交的情况。例如数字8,流形大多数位置只有一维,但在中心相交的时......
  • 数论——欧几里得算法和扩展欧几里得算法 学习笔记
    数论——欧几里得算法和扩展欧几里得算法引入最大公约数最大公约数即为GreatestCommonDivisor,常缩写为gcd。一组整数的公约数,是指同时是这组数中每一个数的约数的数。\(\pm1\)是任意一组整数的公约数;一组整数的最大公约数,是指所有公约数里面最大的一个。最小公倍数最......
  • Lnton羚通视频分析算法开发平台关于电子封条算法监测系统的详细介绍
    Lnton羚通的算法算力云平台是一款卓越的解决方案,具备出众的特点。它提供高性能、高可靠性、高可扩展性和低成本的优势,使用户能够高效地执行复杂计算任务。此外,该平台还提供广泛的算法库和工具,并支持用户上传和部署自定义算法,以增强平台的灵活性和个性化能力。电子封条监控系统利用Y......
  • 算法
    排序算法详情链接:https://www.runoob.com/w3cnote/ten-sorting-algorithm.html......
  • [注意事项] 使用雪花算法,查询时候出现精度缺失
    主键使用雪花算法:@ApiModelProperty("主键id")@TableId(type=IdType.ASSIGN_ID)privateLongid;出现:查询时候出现精度缺失:preview回显的值造成精度缺失,response的值没有问题解决方式:将id转换为字符串的返回@JsonSerialize(using=ToStringSerializer.class)priv......
  • 大三落汤狗の算法笔记 (持续更新)
    1.算法复杂度分析简便:复杂度取阶数最高项,去系数。如:O(3n²+2n+1)=O(n²)O()低阶/o(),Ω()高阶/w(),θ()同阶阶关系成立:自反OΩθ/对称θ/传递OoΩwθO(f)+O(g)=O(max(f,g))O(f)+O(O(f))=O(f)O(递归)迭代法:n次计算,每次O(单次)求和eg:求n!求退出条件:T(1)=1求递推公式:T(n......
  • Lnton羚通算法算力云平台烟雾识别检测系统 烟雾火焰视频分析检测预警
    Lnton羚通的算法算力云平台是一款卓越的解决方案,具备出众的特点。它提供高性能、高可靠性、高可扩展性和低成本的优势,使用户能够高效地执行复杂计算任务。此外,该平台还提供广泛的算法库和工具,并支持用户上传和部署自定义算法,以增强平台的灵活性和个性化能力。火灾监测报警技术是预......
  • Lnton羚通机器视觉算法平台加油站抽烟检测 加油站打电话AI视觉智能算法分析
    Lnton羚通的算法算力云平台是一款卓越的解决方案,具备出众的特点。它提供高性能、高可靠性、高可扩展性和低成本的优势,使用户能够高效地执行复杂计算任务。此外,该平台还提供广泛的算法库和工具,并支持用户上传和部署自定义算法,以增强平台的灵活性和个性化能力。加油站AI视觉分析预警......