c# 陣列轉int - 將int轉換為.NET中的位數組




int轉char c#陣列轉數字 (7)

要轉換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();

如何將int轉換為位數組?

如果我有一個值為3的int我想要一個數組,其長度為8,如下所示:

0 0 0 0 0 0 1 1

這些數字中的每一個都在數組中的單獨插槽中,大小為8。


我會用單線程實現它,如下所示:

using System;
using System.Collections;

namespace Questions
{
    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
}

我剛碰到一個實例......

int val = 2097152;
var arr = Convert.ToString(val, 2).ToArray();
var myVal = arr[21];

......沒有產生我想要的結果。 在上面的'myVal'中,存儲在位置21的數組中的值為'0'。 應該是'1'。 我不確定為什麼我收到了一個不准確的值,它讓我感到困惑,直到我在C#中找到另一種方法將INT轉換為位數組:

int val = 2097152;
var arr = new BitArray(BitConverter.GetBytes(val));
var myVal = arr[21];

這會將結果'true'作為'myVal'的布爾值。

我意識到這可能不是獲得這個值的最有效方法,但它非常簡單,簡單,可讀。


使用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();

int value = 3;

var array = Convert.ToString(value, 2).PadLeft(8, '0').ToArray();

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

public enum QuestionType
{
    Role = 2,
    ProjectFunding = 3,
    TotalEmployee = 4,
    NumberOfServers = 5,
    TopBusinessConcern = 6
}

...是一個很好的聲明。

您必須將結果轉換為int,如下所示:

int Question = (int)QuestionType.Role

否則,類型仍然是QuestionType

這種嚴格程度是C#的方式。

一種替代方法是使用類聲明:

public class QuestionType
{
    public static int Role = 2,
    public static int ProjectFunding = 3,
    public static int TotalEmployee = 4,
    public static int NumberOfServers = 5,
    public static int TopBusinessConcern = 6
}

聲明不那麼優雅,但你不需要在代碼中強制轉換它:

int Question = QuestionType.Role

另外,您可能會對Visual Basic感到更加舒適,它可以滿足許多領域的這種期望。





c# .net