将int转换为.NET中的位数组

时间:2011-07-20 07:06:15

标签: c# .net

如何将int转换为位数组?

如果我是有一个值为3的int我想要一个数组,长度为8,如下所示:

0 0 0 0 0 0 1 1

这些数字中的每一个都位于数组中具有大小为8的单独插槽中。

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,如下面的快照所示:

enter image description here

以下代码有效:

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);