mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-12-19 07:09:04 +08:00
184 lines
3.8 KiB
Java
184 lines
3.8 KiB
Java
|
// BitSet - A vector of bits.
|
||
|
|
||
|
/* Copyright (C) 1998, 1999 Cygnus Solutions
|
||
|
|
||
|
This file is part of libgcj.
|
||
|
|
||
|
This software is copyrighted work licensed under the terms of the
|
||
|
Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
|
||
|
details. */
|
||
|
|
||
|
package java.util;
|
||
|
import java.io.Serializable;
|
||
|
|
||
|
/**
|
||
|
* @author Tom Tromey <tromey@cygnus.com>
|
||
|
* @date October 23, 1998.
|
||
|
*/
|
||
|
|
||
|
/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
|
||
|
* hashCode algorithm taken from JDK 1.2 docs.
|
||
|
*/
|
||
|
|
||
|
public final class BitSet implements Cloneable, Serializable
|
||
|
{
|
||
|
public void and (BitSet bs)
|
||
|
{
|
||
|
if (bs == null)
|
||
|
throw new NullPointerException ();
|
||
|
int max = Math.min(bits.length, bs.bits.length);
|
||
|
int i;
|
||
|
for (i = 0; i < max; ++i)
|
||
|
bits[i] &= bs.bits[i];
|
||
|
for ( ; i < bits.length; ++i)
|
||
|
bits[i] = 0;
|
||
|
}
|
||
|
|
||
|
public BitSet ()
|
||
|
{
|
||
|
this (64);
|
||
|
}
|
||
|
|
||
|
public BitSet (int nbits)
|
||
|
{
|
||
|
if (nbits < 0)
|
||
|
throw new NegativeArraySizeException ();
|
||
|
int length = nbits / 64;
|
||
|
if (nbits % 64 != 0)
|
||
|
++length;
|
||
|
bits = new long[length];
|
||
|
}
|
||
|
|
||
|
public void clear (int pos)
|
||
|
{
|
||
|
if (pos < 0)
|
||
|
throw new IndexOutOfBoundsException ();
|
||
|
int bit = pos % 64;
|
||
|
int offset = pos / 64;
|
||
|
ensure (offset);
|
||
|
bits[offset] &= ~ (1 << bit);
|
||
|
}
|
||
|
|
||
|
public Object clone ()
|
||
|
{
|
||
|
BitSet bs = new BitSet (bits.length * 64);
|
||
|
System.arraycopy(bits, 0, bs.bits, 0, bits.length);
|
||
|
return bs;
|
||
|
}
|
||
|
|
||
|
public boolean equals (Object obj)
|
||
|
{
|
||
|
if (! (obj instanceof BitSet))
|
||
|
return false;
|
||
|
BitSet bs = (BitSet) obj;
|
||
|
int max = Math.min(bits.length, bs.bits.length);
|
||
|
int i;
|
||
|
for (i = 0; i < max; ++i)
|
||
|
if (bits[i] != bs.bits[i])
|
||
|
return false;
|
||
|
// If one is larger, check to make sure all extra bits are 0.
|
||
|
for (int j = i; j < bits.length; ++j)
|
||
|
if (bits[j] != 0)
|
||
|
return false;
|
||
|
for (int j = i; j < bs.bits.length; ++j)
|
||
|
if (bs.bits[j] != 0)
|
||
|
return false;
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
public boolean get (int pos)
|
||
|
{
|
||
|
if (pos < 0)
|
||
|
throw new IndexOutOfBoundsException ();
|
||
|
|
||
|
int bit = pos % 64;
|
||
|
int offset = pos / 64;
|
||
|
|
||
|
if (offset >= bits.length)
|
||
|
return false;
|
||
|
|
||
|
return (bits[offset] & (1 << bit)) == 0 ? false : true;
|
||
|
}
|
||
|
|
||
|
public int hashCode ()
|
||
|
{
|
||
|
long h = 1234;
|
||
|
for (int i = bits.length - 1; i >= 0; --i)
|
||
|
h ^= bits[i] * (i + 1);
|
||
|
return (int) ((h >> 32) ^ h);
|
||
|
}
|
||
|
|
||
|
public void or (BitSet bs)
|
||
|
{
|
||
|
if (bs == null)
|
||
|
throw new NullPointerException ();
|
||
|
ensure (bs.bits.length - 1);
|
||
|
int i;
|
||
|
for (i = 0; i < bs.bits.length; ++i)
|
||
|
bits[i] |= bs.bits[i];
|
||
|
}
|
||
|
|
||
|
public void set (int pos)
|
||
|
{
|
||
|
if (pos < 0)
|
||
|
throw new IndexOutOfBoundsException ();
|
||
|
int bit = pos % 64;
|
||
|
int offset = pos / 64;
|
||
|
ensure (offset);
|
||
|
bits[offset] |= 1 << bit;
|
||
|
}
|
||
|
|
||
|
public int size ()
|
||
|
{
|
||
|
return bits.length * 64;
|
||
|
}
|
||
|
|
||
|
public String toString ()
|
||
|
{
|
||
|
StringBuffer result = new StringBuffer ("{");
|
||
|
boolean first = true;
|
||
|
for (int i = 0; i < bits.length; ++i)
|
||
|
{
|
||
|
int bit = 1;
|
||
|
long word = bits[i];
|
||
|
for (int j = 0; j < 64; ++j)
|
||
|
{
|
||
|
if ((word & bit) != 0)
|
||
|
{
|
||
|
if (! first)
|
||
|
result.append(", ");
|
||
|
result.append(64 * i + j);
|
||
|
first = false;
|
||
|
}
|
||
|
bit <<= 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return result.append("}").toString();
|
||
|
}
|
||
|
|
||
|
public void xor (BitSet bs)
|
||
|
{
|
||
|
if (bs == null)
|
||
|
throw new NullPointerException ();
|
||
|
ensure (bs.bits.length - 1);
|
||
|
int i;
|
||
|
for (i = 0; i < bs.bits.length; ++i)
|
||
|
bits[i] ^= bs.bits[i];
|
||
|
}
|
||
|
|
||
|
// Make sure the vector is big enough.
|
||
|
private final void ensure (int lastElt)
|
||
|
{
|
||
|
if (lastElt + 1 > bits.length)
|
||
|
{
|
||
|
long[] nd = new long[lastElt + 1];
|
||
|
System.arraycopy(bits, 0, nd, 0, bits.length);
|
||
|
bits = nd;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// The actual bits.
|
||
|
private long[] bits;
|
||
|
}
|