bitkey.java
来自「数据仓库展示程序」· Java 代码 · 共 455 行 · 第 1/2 页
JAVA
455 行
}
public boolean isSetByPos(int pos) {
if (pos < 64) {
return ((bits0 & bit(pos)) != 0);
} else {
return ((bits1 & bit(pos)) != 0);
}
}
public void clearByPos(int pos) {
if (pos < 64) {
bits0 &= ~bit(pos);
} else {
bits1 &= ~bit(pos);
}
}
public void clear() {
bits0 = 0;
bits1 = 0;
}
public boolean isSuperSetOf(BitKey bitKey) {
if (bitKey instanceof BitKey.Small) {
BitKey.Small other = (BitKey.Small) bitKey;
return ((this.bits0 | other.bits) == this.bits0);
} else if (bitKey instanceof BitKey.Mid128) {
BitKey.Mid128 other = (BitKey.Mid128) bitKey;
return ((this.bits0 | other.bits0) == this.bits0) &&
((this.bits1 | other.bits1) == this.bits1);
} else if (bitKey instanceof BitKey.Big) {
BitKey.Big other = (BitKey.Big) bitKey;
if ((this.bits0 | other.bits[0]) != this.bits0) {
return false;
} else if ((this.bits1 | other.bits[1]) != this.bits1) {
return false;
} else {
for (int i = 2; i < other.bits.length; i++) {
if (other.bits[i] != 0) {
return false;
}
}
return true;
}
}
return false;
}
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o instanceof BitKey.Small) {
BitKey.Small other = (BitKey.Small) o;
return (this.bits0 == other.bits) && (this.bits1 == 0);
} else if (o instanceof BitKey.Mid128) {
BitKey.Mid128 other = (BitKey.Mid128) o;
return (this.bits0 == other.bits0) &&
(this.bits1 == other.bits1);
} else if (o instanceof BitKey.Big) {
BitKey.Big other = (BitKey.Big) o;
if (this.bits0 != other.bits[0]) {
return false;
} else if (this.bits1 != other.bits[1]) {
return false;
} else {
for (int i = 2; i < other.bits.length; i++) {
if (other.bits[i] != 0) {
return false;
}
}
return true;
}
}
return false;
}
public int hashCode() {
long h = 1234;
h ^= bits0;
h ^= bits1 * 2;
return (int)((h >> 32) ^ h);
}
public String toString() {
StringBuffer buf = new StringBuffer(64);
buf.append("0x");
for (int i = 127; i >= 0; i--) {
buf.append((isSetByPos(i)) ? '1' : '0');
}
return buf.toString();
}
public BitKey copy() {
return new Mid128(this);
}
}
/**
* Implementation of {@link BitKey} with more than 64 bits. Similar to
* {@link java.util.BitSet}, but does not require dynamic resizing.
*/
public class Big extends AbstractBitKey {
private long[] bits;
private Big(int size) {
bits = new long[chunkCount(size)];
}
private Big(Big big) {
bits = (long[]) big.bits.clone();
}
public void setByPos(int pos) {
bits[chunkPos(pos)] |= bit(pos);
}
public boolean isSetByPos(int pos) {
return (bits[chunkPos(pos)] & bit(pos)) != 0;
}
public void clearByPos(int pos) {
bits[chunkPos(pos)] &= ~bit(pos);
}
public void clear() {
for (int i = 0; i < bits.length; i++) {
bits[i] = 0;
}
}
public boolean isSuperSetOf(BitKey bitKey) {
if (bitKey instanceof BitKey.Small) {
BitKey.Small other = (BitKey.Small) bitKey;
return ((this.bits[0] | other.bits) == this.bits[0]);
} else if (bitKey instanceof BitKey.Mid128) {
BitKey.Mid128 other = (BitKey.Mid128) bitKey;
return ((this.bits[0] | other.bits0) == this.bits[0]) &&
((this.bits[1] | other.bits1) == this.bits[1]);
} else if (bitKey instanceof BitKey.Big) {
BitKey.Big other = (BitKey.Big) bitKey;
int len = Math.min(bits.length, other.bits.length);
for (int i = 0; i < len; i++) {
if ((this.bits[i] | other.bits[i]) != this.bits[i]) {
return false;
}
}
if (other.bits.length > this.bits.length) {
for (int i = len; i < other.bits.length; i++) {
if (other.bits[i] != 0) {
return false;
}
}
}
return true;
}
return false;
}
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o instanceof BitKey.Small) {
BitKey.Small other = (BitKey.Small) o;
if (this.bits[0] != other.bits) {
return false;
} else {
for (int i = 1; i < this.bits.length; i++) {
if (this.bits[i] != 0) {
return false;
}
}
return true;
}
} else if (o instanceof BitKey.Mid128) {
BitKey.Mid128 other = (BitKey.Mid128) o;
if (this.bits[0] != other.bits0) {
return false;
} else if (this.bits[1] != other.bits1) {
return false;
} else {
for (int i = 2; i < this.bits.length; i++) {
if (this.bits[i] != 0) {
return false;
}
}
return true;
}
} else if (o instanceof BitKey.Big) {
BitKey.Big other = (BitKey.Big) o;
int len = Math.min(bits.length, other.bits.length);
for (int i = 0; i < len; i++) {
if (this.bits[i] != other.bits[i]) {
return false;
}
}
if (this.bits.length > other.bits.length) {
for (int i = len; i < this.bits.length; i++) {
if (this.bits[i] != 0) {
return false;
}
}
} else if (other.bits.length > this.bits.length) {
for (int i = len; i < other.bits.length; i++) {
if (other.bits[i] != 0) {
return false;
}
}
}
return true;
}
return false;
}
public int hashCode() {
long h = 1234;
for (int i = bits.length; --i >= 0; ) {
h ^= bits[i] * (i + 1);
}
return (int)((h >> 32) ^ h);
}
public String toString() {
StringBuffer buf = new StringBuffer(64);
buf.append("0x");
int start = bits.length*64 -1;
for (int i = start; i >= 0; i--) {
buf.append((isSetByPos(i)) ? '1' : '0');
}
return buf.toString();
}
public BitKey copy() {
return new Big(this);
}
}
}
// End BitKey.java
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?