如何将int转换为位数组?
如果我是有一个值为3的int我想要一个数组,长度为8,如下所示:
0 0 0 0 0 0 1 1
这些数字中的每一个都位于数组中具有大小为8的单独插槽中。
答案 0 :(得分:73)
使用BitArray
类。
int value = 3;
BitArray b = new BitArray(new int[] { value });
如果要获取这些位的数组,可以将BitArray.CopyTo
方法与bool[]
数组一起使用。
bool[] bits = new bool[b.Count];
b.CopyTo(bits, 0);
请注意,这些位将从最低有效位存储到最高有效位,因此您可能希望使用Array.Reverse
。
最后,如果你想为每一位得到0和1而不是布尔(我使用byte
来存储每一位;比int
更少浪费):
byte[] bitValues = bits.Select(bit => (byte)(bit ? 1 : 0)).ToArray();
答案 1 :(得分:46)
转换int'x'
int x = 3;
一种方法,通过操纵int:
string s = Convert.ToString(x, 2); //Convert to binary in a string
int[] bits= s.PadLeft(8, '0') // Add 0's from left
.Select(c => int.Parse(c.ToString())) // convert each char to int
.ToArray(); // Convert IEnumerable from select to Array
或者,通过使用BitArray类 -
BitArray b = new BitArray(new byte[] { x });
int[] bits = b.Cast<bool>().Select(bit => bit ? 1 : 0).ToArray();
答案 2 :(得分:13)
使用Convert.ToString (value, 2)
所以在你的情况下
string binValue = Convert.ToString (3, 2);
答案 3 :(得分:5)
我刚遇到一个......
的实例int val = 2097152;
var arr = Convert.ToString(val, 2).ToArray();
var myVal = arr[21];
...没有产生我想要的结果。在myVal&#39;在上面,存储在位置21的数组中的值是&#39; 0&#39;。它应该是一个&#39; 1。我不确定为什么我收到了一个不准确的值,它让我感到困惑,直到我在C#中找到另一种将INT转换为位数组的方式:
int val = 2097152;
var arr = new BitArray(BitConverter.GetBytes(val));
var myVal = arr[21];
这产生了结果&#39; true&#39;作为&#39; myVal&#39;的布尔值。
我意识到这可能不是获得此值的最有效方法,但它非常简单,简单且易读。
答案 4 :(得分:3)
我会在单行中实现它,如下所示:
using System;
using System.Collections;
namespace stackoverflowQuestions
{
class Program
{
static void Main(string[] args)
{
//get bit Array for number 20
var myBitArray = new BitArray(BitConverter.GetBytes(20));
}
}
}
请注意BitArray
的每个元素都存储为bool,如下面的快照所示:
以下代码有效:
if (myBitArray[0] == false)
{
//this code block will execute
}
但是代码下面根本不编译:
if (myBitArray[0] == 0)
{
//some code
}
答案 5 :(得分:2)
int value = 3;
var array = Convert.ToString(value, 2).PadLeft(8, '0').ToArray();
答案 6 :(得分:0)
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;
if (inp > 0)
{
for (var i = 0; i < siz && cur < length; ++i)
{
ret[cur++] = (inp & pow) == pow;
pow *= 2;
}
}
else
{
for (var i = 0; i < siz && cur < length; ++i)
{
ret[cur++] = (inp & pow) != pow;
pow *= 2;
}
}
}
return ret;
}
答案 7 :(得分:0)
要将整数输入转换为任意大小的布尔数组,只需使用LINQ。
bool[] ToBits(int input, int numberOfBits) {
return Enumerable.Range(0, numberOfBits)
.Select(bitIndex => 1 << bitIndex)
.Select(bitMask => (input & bitMask) == bitMask)
.ToArray();
}
因此要将整数转换为最多32位的布尔数组,只需像这样使用它即可:
bool[] bits = ToBits(65, 8); // true, false, false, false, false, false, true, false
您可能希望根据需要反转阵列。
Array.Reverse(bits);