Java使用byte数组实现bit array

Bitmap类介绍

最近在考试,一直复习的有点枯燥.于是想着在闲余时间练一下Java代码,就写了这么一个bit array的实现,并且利用这个bit array完成二进制,十进制以及十六进制值的相互转换.

我写的实现类最初起名为bitmap(与数据结构bitmap没有关系),后来就懒得修改了,其实两个名称在这里是同一个意思,就不用太纠结他们的称呼了.

Bit array简介

Bit array 顾名思义就是一个以bit为数据结构的数组.每个bit只能拥有两个值,0和1.他们可以简单的理解为false与true值(boolean),所以在不同的使用环境下,他们可以拥有不同的解释.比如控制某些开关的映射: on/off;控制某些值的是否有效: valid/invalid,等等..在这些环境中,最简单最有效的方式当然是使用bit作为数据结构,既节省空间,操作又方便.


Java实现

很可惜的是,java并没有提供bit这种数据类型,即使最小的数据类型byte,也要占到8个bit.(以前从哪里看到过boolean值在不同的jvm实现下面可能是1bit,也可能是8bit,不过我对这个说法表示怀疑...).

所以在这里我考虑使用一个byte数组来实现bit array,不过这样就导致了不能使用原本很简单的数组操作,而是需要使用稍微复杂一点的比特操作(bitwise operation)来实现:

 void set(int)      将某一位的bit值点亮(设置为1)

boolean get(int)      获得某一位bit的值(0或1)

void clear(int)   将某一位的bit值清空(设置为0)

String toString() 用位的结构展现这个bitmap

这里要提一下,因为是byte数组而不是bit数组,所以如果直接看数组的值可能会完全莫不找头脑.因为这里的表达方式是一个十进制值,而不是二进制值.

比如,一个长度为8个bit数组应该是这样的:

0 0 1 0 0 0 1 1


但是如果把这个值当作byte类型处理,这个值就变成了

67

再比如:

11111111 11111111 11111111 11111111   (十进制为-1)

如果放在我的byte数组中,数组的长度需要为4,而这个数组的值为:

[-1, -1, -1, -1]

这样是完全看不出来bitmap的内部结构的,所以这里提供了一个toString()方法,将这个值重新以二进制的方式表现出来.


除此之外,我还提供了大部分逻辑门的操作:

逻辑门可以接受n个输入(n>=1,根据不同的门决定不同的数量,比如not只能有一个输入,而or和and理论上可以有无数个),然后经过一定的逻辑运算,得出一个1或0的输出.逻辑门是集成电路上最基础的组件,所有的运算都离不开他们.

一般逻辑门的输入和结果都是以这样的表来表示:

下面是一个and的示例:

input1 input2 output
0 0 0
0 1 0
1 0 0
1 1 1

这里篇幅有限,就不把所有的表列出来了,只是提供一下他们的逻辑结果:

操作 结果
not(a) 将所有值反转.
or(a, b)  两个值中其中一个为1
and(a, b) 两个值都是1,结果为1
nor(a, b)  两个值都是0,结果为1
xor(a, b)  两个值不相同的,结果为1
xnor(a, b) 两个值相同,结果为1<
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值