在c#中将二进制字符串转换为整数数组

时间:2014-01-04 23:19:01

标签: c#

我想在c#中将二进制值转换为整数数组。

例如考虑二进制值:111,它的等价整数等于7(最右边的数字等于整数1,中间的二进制数字等于整数2,最左边的数字是4,所以1 + 2 + 4 = 7)。

如何使用c#以数组(或列表)的形式获取每个整数位(即1,2,4)?

3 个答案:

答案 0 :(得分:3)

像这样:

string binaryString = "111";
var integerValue = Convert.ToInt64(binaryString,2);

integerValue现在将是7。

更新,感谢评论:

如果你想存储每个值,那么你需要在for循环和位移(<< operator)中逐步完成字符串,以达到你想要的结果。

[Test]
public void BinaryStringToValues()
{
    const string binaryString = "111";
    var values = new List<int>();
    for (var i = 0; i < binaryString.Length; i++)
    {
        if (binaryString[binaryString.Length - i - 1] == '0')
        {
            continue;
        }
        values.Add(1 << i);
    }

    Assert.AreEqual(1, values[0]);
    Assert.AreEqual(2, values[1]);
    Assert.AreEqual(4, values[2]);
}

测试将通过。

答案 1 :(得分:3)

string bin = "1011";

var str = String.Join(",", bin.Reverse().Select((c, i) => (c - '0') * (1 << i)));

str将是1,2,0,8。如果你想把结果作为一个列表

var list = bin.Reverse().Select((c, i) => (c - '0') * (1 << i)).ToList();

答案 2 :(得分:2)

你想要的并不完全清楚,但我们假设从这个字符串开始:

"1011011"

你想得到这个数组:

64, 16, 8, 2, 1

然后您可以使用此代码(LINQPad程序):

void Main()
{
    string input = "1011011";

    int[] values = input
        .Select((value, idx) => value == '1'
                ? (1 << (input.Length - idx - 1))
                : 0)
        .Where(value => value > 0)
        .ToArray();

    values.Dump();
}

输出:

linqpad output

这将:

  • 对于'1'
  • 的每个字符
  • 从右侧开始计算最右侧位置为0的位置
  • 然后它会计算1 << x(x就是那个位置),最右边的位置会返回1,左边的一个会返回2,2的左边是4,下一个是8,16 ,32,64等等。
  • 此时的数组为[64, 0, 16, 8, 0, 2, 1],因此我们将删除零