【发布时间】:2011-05-25 18:52:09
【问题描述】:
如何将 int 转换为 bool 数组(表示整数中的位)?例如:
4 = { true, false, false }
7 = { true, true, true }
255 = { true, true, true, true, true, true, true, true }
【问题讨论】:
标签: c#
如何将 int 转换为 bool 数组(表示整数中的位)?例如:
4 = { true, false, false }
7 = { true, true, true }
255 = { true, true, true, true, true, true, true, true }
【问题讨论】:
标签: c#
您可以使用BitArray。
var bools = new BitArray(new int[] { yourInt }).Cast<bool>().ToArray();
【讨论】:
new int[yourInt] 应该是new int[]{yourInt}
yourInt为255,则不会创建一个长度为8的全为真的数组,甚至不会创建一个长度为32且后八为真的数组,它会创建一个长度为8160的数组,全为false。
new(size),这正是它对int 构造函数所做的事情。那说它也咬了我。
Int32 number = 10;
var array = Convert.ToString(number, 2).Select(s => s.Equals('1')).ToArray();
--编辑--
使用扩展方法:
public static class Int32Extensions
{
public static Boolean[] ToBooleanArray(this Int32 i)
{
return Convert.ToString(i, 2 /*for binary*/).Select(s => s.Equals('1')).ToArray();
}
}
用法:
var boolArray = number.ToBooleanArray();
【讨论】:
int 应该很好地映射到 BitVector32(或 BitArray)
int i = 4;
var bv = new BitVector32(i);
bool x = bv[0], y = bv[1], z = bv[2]; // example access via indexer
但是,我个人只会使用轮班(>> 等)并将其保留为int。 bool[] 会很多更大
【讨论】:
您可以使用BitArray 轻松地从数字中获取布尔值集合:
var b = new BitArray(new int[] { 255 });
但是,它将使用值中的所有位,因此上面将为您提供长度为 32 的 BitArray,因为 int 数据类型是 32 位。
您可以从字节创建BitArray,这将为您提供每个字节的八个布尔值:
var b = new BitArray(new byte[] { 255 });
您可以通过跳过前导错误来获得仅包含有效位的数组:
bool[] b = new BitArray(42).Cast<bool>().SkipWhile(x => !x).ToArray();
【讨论】:
您可以分两步执行此操作,首先使用 Convert.ToString 将整数转换为二进制(以 2 为基数)字符串表示,然后遍历该字符串以填充 BitArray。
例如:
int someInt = 7;
string binaryString = Convert.ToString(someInt, 2);
BitArray bitArray = new BitArray(binaryString.Length);
for (int i = 0; i < bitArray.Length; i++)
{
bitArray[i] = (binaryString[i] == '1');
}
【讨论】:
BitArray 有一个采用整数数组的构造函数。
public static bool[] Convert(int[] input, int length)
{
var ret = new bool[length];
var siz = sizeof(int) * 8;
var pow = 0;
var cur = 0;
for (var a = 0; a < input.Length && cur < length; ++a)
{
var inp = input[a];
pow = 1;
for (var i = 0; i < siz && cur < length; ++i)
{
ret[cur++] = inp > 0 ? (inp & pow) != 0 : (inp & pow) == 0;
pow *= 2;
}
}
return ret;
}
【讨论】: