/* * Copyright 2007 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System; namespace com.google.zxing.common { ///

A simple, fast array of bits, represented compactly by an array of ints internally.

/// ///
/// Sean Owen /// /// www.Redivivus.in (suraj.supekar@redivivus.in) - Ported from ZXING Java Source /// public sealed class BitArray { public int Size { get { return size; } } // TODO: I have changed these members to be public so ProGuard can inline get() and set(). Ideally // they'd be private and we'd use the -allowaccessmodification flag, but Dalvik rejects the // resulting binary at runtime on Android. If we find a solution to this, these should be changed // back to private. public int[] bits; //UPGRADE_NOTE: Final was removed from the declaration of 'size '. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" public int size; public BitArray(int size) { if (size < 1) { throw new System.ArgumentException("size must be at least 1"); } this.size = size; this.bits = makeArray(size); } /// bit to get /// /// true iff bit i is set /// public bool get_Renamed(int i) { return (bits[i >> 5] & (1 << (i & 0x1F))) != 0; } /// Sets bit i. /// /// /// bit to set /// public void set_Renamed(int i) { bits[i >> 5] |= 1 << (i & 0x1F); } /// Flips bit i. /// /// /// bit to set /// public void flip(int i) { bits[i >> 5] ^= 1 << (i & 0x1F); } /// Sets a block of 32 bits, starting at bit i. /// /// /// first bit to set /// /// the new value of the next 32 bits. Note again that the least-significant bit /// corresponds to bit i, the next-least-significant to i+1, and so on. /// public void setBulk(int i, int newBits) { bits[i >> 5] = newBits; } /// Clears all bits (sets to false). public void clear() { int max = bits.Length; for (int i = 0; i < max; i++) { bits[i] = 0; } } /// Efficient method to check if a range of bits is set, or not set. /// /// /// start of range, inclusive. /// /// end of range, exclusive /// /// if true, checks that bits in range are set, otherwise checks that they are not set /// /// true iff all bits are set or not set in range, according to value argument /// /// IllegalArgumentException if end is less than or equal to start public bool isRange(int start, int end, bool value_Renamed) { if (end < start) { throw new System.ArgumentException(); } if (end == start) { return true; // empty range matches } end--; // will be easier to treat this as the last actually set bit -- inclusive int firstInt = start >> 5; int lastInt = end >> 5; for (int i = firstInt; i <= lastInt; i++) { int firstBit = i > firstInt?0:start & 0x1F; int lastBit = i < lastInt?31:end & 0x1F; int mask; if (firstBit == 0 && lastBit == 31) { mask = - 1; } else { mask = 0; for (int j = firstBit; j <= lastBit; j++) { mask |= 1 << j; } } // Return false if we're looking for 1s and the masked bits[i] isn't all 1s (that is, // equals the mask, or we're looking for 0s and the masked portion is not all 0s if ((bits[i] & mask) != (value_Renamed?mask:0)) { return false; } } return true; } /// underlying array of ints. The first element holds the first 32 bits, and the least /// significant bit is bit 0. /// public int[] getBitArray() { return bits; } /// Reverses all bits in the array. public void reverse() { int[] newBits = new int[bits.Length]; int size = this.size; for (int i = 0; i < size; i++) { if (get_Renamed(size - i - 1)) { newBits[i >> 5] |= 1 << (i & 0x1F); } } bits = newBits; } private static int[] makeArray(int size) { int arraySize = size >> 5; if ((size & 0x1F) != 0) { arraySize++; } return new int[arraySize]; } public override System.String ToString() { System.Text.StringBuilder result = new System.Text.StringBuilder(size); for (int i = 0; i < size; i++) { if ((i & 0x07) == 0) { result.Append(' '); } result.Append(get_Renamed(i)?'X':'.'); } return result.ToString(); } } }