写个小东西,要去重复数字,用到BIT数组,虽然JAVA已经提供了一个BitSet,不过自己手痒,又写了一个简单的

原理就不写了,网上一大堆

 1 import java.util.Iterator;
 2 import java.util.function.BiConsumer;
 3
 4 public class BitArray implements Iterable<Boolean>{
 5     //表示1<<n的值,提高效率,不用每次计算
 6     private final byte[] MASK = new byte[]{1,2,4,8,16,32,64,(byte)128};
 7     byte[] bits;
 8     int max = 0;
 9
10     /**
11      * 构造一个Bit数组
12      * @param max 最大位数
13      */
14     public BitArray(int max){
15         this.max = max;
16         int len = max / 8 + 1;
17
18         bits = new byte[len];
19     }
20
21     /**
22      * 设置第N位的值
23      * @param index Bit索引
24      * @param value 值
25      */
26     public void set(int index,boolean value){
27         int i = index / 8;
28         int move = index % 8;
29
30         bits[i] = (byte)(bits[i] | MASK[move]);
31     }
32
33     /**
34      * 取得第N位的值
35      * @param index Bit索引
36      * @return
37      */
38     public boolean get(int index){
39         int i = index / 8;
40         int move = index % 8;
41
42         return (bits[i] & MASK[move]) == MASK[move];
43     }
44
45     /**
46      * 显示所有位
47      */
48     public void show(){
49         for(int i=0; i<bits.length; i++){
50             byte b = bits[i];
51             for(int bitIndex=0; bitIndex<8;bitIndex++){
52                 System.out.print( ((b>>bitIndex) & 1) + " ");
53             }
54             System.out.println();
55         }
56     }
57
58     /**
59      * 提供遍历接口
60      */
61     public Iterator<Boolean> iterator() {
62         return new Iterator<Boolean>(){
63             private int i = 0;
64
65             public boolean hasNext() {
66                 return i <= max;
67             }
68
69             public Boolean next() {
70                 return get(i++);
71             }
72
73         };
74     }
75
76     /**
77      * 遍历,偷懒用了JAVA8的新接口
78      * @param fun
79      */
80     public void forEach(BiConsumer<Integer,Boolean> fun){
81         int total = 0;
82         for(int i=0; i<bits.length; i++){
83             byte b = bits[i];
84             for(int bitIndex=0; bitIndex<8 && total<=max;bitIndex++,total++){
85                 fun.accept(total, ((b>>bitIndex) & 1) == 1);
86             }
87         }
88     }
89 }

使用方式:

public static void main( String[] args ) throws Exception
{BitArray bits = new BitArray(18);bits.set(18,true);System.out.println("position 3 : " + bits.get(3));System.out.println("position 18 : " + bits.get(18));System.out.println("--------------------------");//遍历方式 一int i = 0;for(Boolean result : bits)System.out.println(i++ + " : " + result);System.out.println("--------------------------");//遍历方式二BiConsumer<Integer,Boolean> fun = (index, value)->{System.out.println(index + " : " + value);};        bits.forEach(fun);
}

输出结果:

/*
position 3 : false
position 18 : true
--------------------------
0 : false
1 : false
2 : false
3 : false
4 : false
5 : false
6 : false
7 : false
8 : false
9 : false
10 : false
11 : false
12 : false
13 : false
14 : false
15 : false
16 : false
17 : false
18 : true
--------------------------
0 : false
1 : false
2 : false
3 : false
4 : false
5 : false
6 : false
7 : false
8 : false
9 : false
10 : false
11 : false
12 : false
13 : false
14 : false
15 : false
16 : false
17 : false
18 : true
*/

转载于:https://www.cnblogs.com/varlxj/p/5168157.html

JAVA的BIT数组相关推荐

  1. JAVA学习笔记--数组初始化

    JAVA中,数组只是相同类型的.用一个标识符名称封装到一起的一个对象序列或基本类型数据序列.数组通过方括号下标操作符[]来定义和使用,要定义一个数组只需在类型名后面加上一个方括号即可,如: int[] ...

  2. java的byte php_java_浅谈java的byte数组的不同写法,(由于篇幅原因阐述的不够详 - phpStudy...

    浅谈java的byte数组的不同写法 (由于篇幅原因阐述的不够详细科学,不喜勿喷). 经常看到java中对byte数组的不同定义,粗略整理的一下: 一个字节(byte)=8位(bit),"b ...

  3. Java学习_day007:数组与方法

    一.数组 数组的复制 int[]a={10,20,30,40,50}; int[]b=new int[6]; //b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4 ...

  4. java 复制一个数组_浅谈Java中复制数组的方式

    在Java里面,可以用复制语句"A=B"给基本类型的数据传递值,但是如果A,B是两个同类型的数组,复制就相当于将一个数组变量的引用传递给另一个数组:如果一个数组发生改变,那么引用同 ...

  5. Java进阶知识-数组类型

    前言 本来数组类型应该属于基础部分的知识,我将它写在进阶部分是因为数组既可以是基础数据类型数组,也可以是引用数据类型数组.所以我想先介绍完类与对象的基础之后,再给大家介绍数组.于是,今天这篇内容给大家 ...

  6. 扫盲!Java可变长数组,看这篇就对了!

    来自:ImportNew/覃佑桦 | 责编:乐乐 链接:tutorials.jenkov.com/java-performance/resizable-array.html 有时我们希望将把数据保存在 ...

  7. Java语言基础(数组)

    Java语言基础(数组概述和定义格式说明) A:为什么要有数组(容器) 为了存储同种数据类型的多个值 B:数组概念 数组是存储同一种数据类型多个元素的集合.也可以看成是一个容器. 数组既可以存储基本数 ...

  8. 1.3 Java二维数组详解

    为了方便组织各种信息,计算机常将信息以表的形式进行组织,然后再以行和列的形式呈现出来.二维数组的结构决定了其能非常方便地表示计算机中的表,以第一个下标表示元素所在的行,第二个下标表示元素所在的列.下面 ...

  9. java基础(十) 数组类型

    ###1. 数组类简介 在java中,数组也是一种引用类型,即是一种类. 我们来看一个例子,理解一下数组类: public static void main(String[] args) {Class ...

  10. Java里的数组介绍

    注意, 本文讲的是数组(Array),  非数组型线性表容器(ArrayList). 一. C语言的静态数组和动态数组. 稍微接触过c的程序猿都应该知道, c语言里的数组分为静态数组和动态数组. 1. ...

最新文章

  1. 少年郎,你为什么没有对象?是缺点“土味情话”
  2. WireShark数据包分析数据封装
  3. 一个按钮触发两个事件可以吗?
  4. [转]自定义SqlMembershipProvider方法
  5. laravel php7.2报错,laravel,php_运行php artisan serve时报错,laravel,php - phpStudy
  6. 【慢慢学Android】:11.对话框大全
  7. COM学习(四)——COM中的数据类型
  8. 如何利用迅雷下载百度云获取实际下载地址
  9. 软件项目管理案例教程(第三版)习题及答案(适用于工程项目管理课程)
  10. Updates were rejected because the tip of your current branch is behind hint: its remote counterpart
  11. PowerDesigner清理注册表
  12. 大连新计划__为什么企业要开发APP软件?
  13. 自动化冒烟测试:Unittest vs Pytest框架
  14. write字符串python_Python-write()与writelines()和连接字符串
  15. wxpython基本控件
  16. 【欣赏】logo设计原则 + 一组设计独特的logo欣赏
  17. 使用Vivado生成ADI的ADC例程(以AD9680为例)
  18. 机器学习--逻辑回归模型(Logistic Regression)
  19. pdf的创建时间怎么修改?
  20. java 02-cf_厉害!腾讯架构大牛发布Java零基础就业宝典,人生终于不迷茫了

热门文章

  1. Java本地文件操作
  2. C语言存储编码输出,C语言怎么输出一个菱形
  3. pve安装黑群晖直通硬盘_PVE+lede+DSM网卡硬盘直通+win10
  4. 震惊!Fibonacci Again
  5. js文件夹上传到服务器,js 上传img到服务器
  6. 计算机图案填充的两种方法,计算机图形学课件 第9讲 区域填充和字符处理.ppt...
  7. centos7 python3 sqlserver,centos7中python3环境支持s
  8. 串行口实验 编写程序利用PC机控制单片机实验板上的数码管设备工作
  9. java ios压缩图片,Java、ios图片上传
  10. java union pay 代码_Java标记了union / sum类型