JAVA的BIT数组
写个小东西,要去重复数字,用到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数组相关推荐
- JAVA学习笔记--数组初始化
JAVA中,数组只是相同类型的.用一个标识符名称封装到一起的一个对象序列或基本类型数据序列.数组通过方括号下标操作符[]来定义和使用,要定义一个数组只需在类型名后面加上一个方括号即可,如: int[] ...
- java的byte php_java_浅谈java的byte数组的不同写法,(由于篇幅原因阐述的不够详 - phpStudy...
浅谈java的byte数组的不同写法 (由于篇幅原因阐述的不够详细科学,不喜勿喷). 经常看到java中对byte数组的不同定义,粗略整理的一下: 一个字节(byte)=8位(bit),"b ...
- 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 ...
- java 复制一个数组_浅谈Java中复制数组的方式
在Java里面,可以用复制语句"A=B"给基本类型的数据传递值,但是如果A,B是两个同类型的数组,复制就相当于将一个数组变量的引用传递给另一个数组:如果一个数组发生改变,那么引用同 ...
- Java进阶知识-数组类型
前言 本来数组类型应该属于基础部分的知识,我将它写在进阶部分是因为数组既可以是基础数据类型数组,也可以是引用数据类型数组.所以我想先介绍完类与对象的基础之后,再给大家介绍数组.于是,今天这篇内容给大家 ...
- 扫盲!Java可变长数组,看这篇就对了!
来自:ImportNew/覃佑桦 | 责编:乐乐 链接:tutorials.jenkov.com/java-performance/resizable-array.html 有时我们希望将把数据保存在 ...
- Java语言基础(数组)
Java语言基础(数组概述和定义格式说明) A:为什么要有数组(容器) 为了存储同种数据类型的多个值 B:数组概念 数组是存储同一种数据类型多个元素的集合.也可以看成是一个容器. 数组既可以存储基本数 ...
- 1.3 Java二维数组详解
为了方便组织各种信息,计算机常将信息以表的形式进行组织,然后再以行和列的形式呈现出来.二维数组的结构决定了其能非常方便地表示计算机中的表,以第一个下标表示元素所在的行,第二个下标表示元素所在的列.下面 ...
- java基础(十) 数组类型
###1. 数组类简介 在java中,数组也是一种引用类型,即是一种类. 我们来看一个例子,理解一下数组类: public static void main(String[] args) {Class ...
- Java里的数组介绍
注意, 本文讲的是数组(Array), 非数组型线性表容器(ArrayList). 一. C语言的静态数组和动态数组. 稍微接触过c的程序猿都应该知道, c语言里的数组分为静态数组和动态数组. 1. ...
最新文章
- 少年郎,你为什么没有对象?是缺点“土味情话”
- WireShark数据包分析数据封装
- 一个按钮触发两个事件可以吗?
- [转]自定义SqlMembershipProvider方法
- laravel php7.2报错,laravel,php_运行php artisan serve时报错,laravel,php - phpStudy
- 【慢慢学Android】:11.对话框大全
- COM学习(四)——COM中的数据类型
- 如何利用迅雷下载百度云获取实际下载地址
- 软件项目管理案例教程(第三版)习题及答案(适用于工程项目管理课程)
- Updates were rejected because the tip of your current branch is behind hint: its remote counterpart
- PowerDesigner清理注册表
- 大连新计划__为什么企业要开发APP软件?
- 自动化冒烟测试:Unittest vs Pytest框架
- write字符串python_Python-write()与writelines()和连接字符串
- wxpython基本控件
- 【欣赏】logo设计原则 + 一组设计独特的logo欣赏
- 使用Vivado生成ADI的ADC例程(以AD9680为例)
- 机器学习--逻辑回归模型(Logistic Regression)
- pdf的创建时间怎么修改?
- java 02-cf_厉害!腾讯架构大牛发布Java零基础就业宝典,人生终于不迷茫了
热门文章
- Java本地文件操作
- C语言存储编码输出,C语言怎么输出一个菱形
- pve安装黑群晖直通硬盘_PVE+lede+DSM网卡硬盘直通+win10
- 震惊!Fibonacci Again
- js文件夹上传到服务器,js 上传img到服务器
- 计算机图案填充的两种方法,计算机图形学课件 第9讲 区域填充和字符处理.ppt...
- centos7 python3 sqlserver,centos7中python3环境支持s
- 串行口实验 编写程序利用PC机控制单片机实验板上的数码管设备工作
- java ios压缩图片,Java、ios图片上传
- java union pay 代码_Java标记了union / sum类型