#region License
// Copyright (c) 2007 James Newton-King
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using Newtonsoft.Utilities.Reflection;
namespace Newtonsoft.Utilities.Miscellaneous
{
public static class BitUtils
{
public const int ByteLength = 8;
public static int ConvertToInt32(string input)
{
if (input == null)
throw new ArgumentNullException("input");
int len = input.Length;
int sum = 0, position = 0;
for (int i = len - 1; i >= 0; i--)
{
if (input[i] == '1')
sum = sum + (1 << position);
position++;
}
return sum;
}
public static string BitArrayToString(BitArray bits)
{
StringBuilder sb = new StringBuilder(bits.Length);
for (int i = bits.Length - 1; i >= 0; i--)
{
bool bit = bits[i];
sb.Append(Convert.ToInt32(bit));
}
return sb.ToString();
}
public static byte[] BitArrayToByteArray(this BitArray bits)
{
return BitArrayToByteArray(bits, 0, bits.Length);
}
public static byte[] BitArrayToByteArray(this BitArray bits, int startIndex, int count)
{
// Get the size of bytes needed to store all bytes
int bytesize = count / ByteLength;
// Any bit left over another byte is necessary
if (count % ByteLength > 0)
bytesize++;
// For the result
byte[] bytes = new byte[bytesize];
// Must init to good value, all zero bit byte has value zero
// Lowest significant bit has a place value of 1, each position to
// to the left doubles the value
byte value = 0;
byte significance = 1;
// Remember where in the input/output arrays
int bytepos = 0;
int bitpos = startIndex;
while (bitpos - startIndex < count)
{
// If the bit is set add its value to the byte
if (bits[bitpos])
value += significance;
bitpos++;
if (bitpos % ByteLength == 0)
{
// A full byte has been processed, store it
// increase output buffer index and reset work values
bytes[bytepos] = value;
bytepos++;
value = 0;
significance = 1;
}
else
{
// Another bit processed, next has doubled value
significance *= 2;
}
}
return bytes;
}
public static T Not(this T value, T not)// where T : IEquatable
{
if (!OperatorFactory.GetAnd()(value, not).Equals(default(T)))
return OperatorFactory.GetXor()(value, not);
return value;
}
}
}