private BitVector(Bit[] bits)
{
- this.bits = Objects.requireNonNull(bits);
+ this.bits = Objects.requireNonNull(bits);// do this first to "catch" bits==null before the foreach loop
+ for (Bit bit : bits)
+ if (bit == null)
+ throw new NullPointerException();
}
public static BitVector of(Bit... bits)
*
* @author Christian Femers
*/
- @SuppressWarnings("synthetic-access")
public static final class BitVectorMutator implements LogicType<BitVectorMutator, BitVector>
{
private Bit[] bits;
return new BitVectorMutator(bv.getBits());
}
+ /**
+ * Returns a new mutator of the specified length, <b>with all bits set to <code>null</code></b>. Use with care!
+ */
+ public static BitVectorMutator ofLength(int length)
+ {
+ return new BitVectorMutator(new Bit[length]);
+ }
+
/**
* Returns an empty mutator which has no bits set and will simply copy the values from the first binary operation performed.
- *
*/
public static BitVectorMutator empty()
{
*
* @throws IllegalStateException if the mutator is (still) empty
*/
- public BitVector get()
+ public BitVector toBitVector()
{
if (bits == null)
throw new IllegalStateException("cannot create a BitVector from an empty mutator");
return this;
}
+ public void setBit(int bitIndex, Bit bit)
+ {
+ bits[bitIndex] = bit;
+ }
+
+ public Bit getBit(int bitIndex)
+ {
+ return bits[bitIndex];
+ }
+
+ public int length()
+ {
+ return bits.length;
+ }
+
private void checkCompatibility(BitVector bv)
{
if (bits != null && bits.length != bv.length())
return Arrays.equals(bits, offset, offset + other.length(), other.bits, 0, other.length());
}
+ @Override
+ public String toString()
+ {
+ return toBitStringMSBFirst();
+ }
+
/**
* All {@link Bit}s symbols concatenated together
*
* @see #parse(String)
*/
- @Override
- public String toString()
+ public String toBitStringLSBFirst()
+ {
+ StringBuilder sb = new StringBuilder(bits.length);
+ for (Bit bit : bits)
+ sb.append(bit);
+ return sb.toString();
+ }
+
+ /**
+ * All {@link Bit}s symbols concatenated together, with the MSB coming first (like a binary number)
+ *
+ * @see #parse(String)
+ */
+ public String toBitStringMSBFirst()
{
StringBuilder sb = new StringBuilder(bits.length);
for (Bit bit : bits)
sb.append(bit);
+ sb.reverse();
return sb.toString();
}
/**
* Parses a String containing solely {@link Bit} symbols
*
- * @see #toString()
+ * @see #toBitStringLSBFirst()
*/
- public static BitVector parse(String s)
+ public static BitVector parseLSBFirst(String s)
{
Bit[] values = new Bit[s.length()];
for (int i = 0; i < s.length(); i++)
return new BitVector(values);
}
+ /**
+ * Parses a String containing solely {@link Bit} symbols, with the MSB coming first (like a binary number)
+ *
+ * @see #toBitStringLSBFirst()
+ */
+ public static BitVector parseMSBFirst(String s)
+ {
+ Bit[] values = new Bit[s.length()];
+ for (int i = 0, j = s.length() - 1; j >= 0; i++, j--)
+ {
+ values[i] = Bit.parse(s, j);
+ }
+ return new BitVector(values);
+ }
+
@Override
public Iterator<Bit> iterator()
{