Added MSB first versions of parse() and toString()
[Mograsim.git] / net.mograsim.logic.core / src / net / mograsim / logic / core / types / BitVector.java
index 0bd5ae5..9e09f43 100644 (file)
@@ -23,10 +23,10 @@ public final class BitVector implements StrictLogicType<BitVector>, Iterable<Bit
 
        private BitVector(Bit[] 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();
-               this.bits = Objects.requireNonNull(bits);
        }
 
        public static BitVector of(Bit... bits)
@@ -286,26 +286,45 @@ public final class BitVector implements StrictLogicType<BitVector>, Iterable<Bit
                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++)
@@ -315,6 +334,21 @@ public final class BitVector implements StrictLogicType<BitVector>, Iterable<Bit
                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()
        {