2 回答
TA贡献1875条经验 获得超5个赞
使用 32 位值(8、16、64 个整数也适用)作为存储和辅助字段,基于 hashmap制作惰性数据结构(而 hashmap 有时可能比 o(1) 的访问时间更短)InitFlag
要清除所有内容,请制作空地图InitFlag = 0 (删除旧地图是 GC 在 Java 中的工作,不是吗?)
要设置所有,请制作空地图 InitFlag = 1
更改某个位时,检查是否bitnum/32存在对应的 int 键。如果是,只需更改bitnum&32位,如果不是,则位值不同于InitFlag- 创建具有基于InitFlag(全零或全一)的值的键并更改所需的位。
在检索某个位时,检查是否存在对应的密钥。如果是,则提取位,如果不是 - 获取InitFlag值
SetAll(0): ifl = 0, map - {}
SetBit(35): ifl = 0, map - {1 : 0x10}
SetBit(32): ifl = 0, map - {1 : 0x12}
ClearBit(32): ifl = 0, map - {1 : 0x10}
ClearBit(1): do nothing, ifl = 0, map - {1 : 0x10}
GetBit(1): key=0 doesn't exist, return ifl=0
GetBit(35): key=1 exists, return map[1]>>3 =1
SetAll(1): ifl = 1, map = {}
SetBit(35): do nothing
ClearBit(35): ifl = 1, map - {1 : 0xFFFFFFF7 = 0b...11110111}
and so on
TA贡献1795条经验 获得超7个赞
如果这是大学/高中计算机科学测试或家庭作业问题 - 我怀疑他们试图让您使用BOOLEAN BIT-WISE LOGIC - 具体来说,将位保存在 int 或 long 中。我怀疑(但我不是读心者——我可能是错的!)使用“数组”正是你的老师希望你避免的。
例如 - 这句话是从谷歌的搜索结果中复制的:
长:将长的数据类型是一个64位的二的补码整数。有符号 long 的最小值为 -263,最大值为 263-1。在 Java SE 8 及更高版本中,您可以使用 long 数据类型来表示无符号的 64 位 long,其最小值为 0,最大值为 264-1
这意味着 Java 中的单个 long 变量可以存储 64 个按位值:
long storage;
// To get the first bit-value, use logical-or ('|') and get the bit.
boolean result1 = (boolean) storage | 0b00000001; // Gets the first bit in 'storage'
boolean result2 = (boolean) storage | 0b00000010; // Gets the second
boolean result3 = (boolean) storage | 0b00000100; // Gets the third
...
boolean result8 = (boolean) storage | 0b10000000; // Gets the eighth result.
我可以为您编写整个内容,但我不能 100% 确定您的实际规格 - 如果您使用 long,则只能存储 64 个单独的二进制值。如果您想要任意数量的值,则必须根据需要使用尽可能多的“长”。
这是关于二进制/布尔值的 SO 帖子: Java 中的二进制表示
这是一篇关于位移位的 SO 帖子: Java - Circular shift using bitwise operations
同样,这将是一份工作,我不会编写整个项目。但是,get(int index)和set(int index, boolean val)方法将涉及数字 1 的逐位移位。
int pos = 1;
pos = pos << 5; // This would function as a 'pointer' to the fifth element of the binary number list.
storage | pos; // This retrieves the value stored as position 5.
添加回答
举报