52180


C#でN 個の 2 進数のデータに対して排他的論理和(xor) を取った結果を 4 桁の 2 進数で出力  
するプログラムを作っています。  
その際、char配列をstringに変換する機能を実装中に以下の問題が発生しました。  
以下の「作成したソースコード」の、

[code]

    string output = new string(finalCharAnsArray);
    int intOutput = int.Parse(output);
    Console.WriteLine(string.Format("{0:0000}", intOutput));
    
[/code]

の部分の、

[code]

    string output = new string(finalCharAnsArray);
    
[/code]

の部分で、  
char配列をstringに変換できなくて困っています。  
（outputの中身が"\u0001\0\u0001"になっています。本当は"101"の文字列にしたいです。）

<作成したソースコード>

[code]

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    namespace CsharpPractice
    {
        class Program
        {
            static void Main(string[] args)
            {
                int inputCount = 2;
                int[] inputs = new int[inputCount];
                inputs[0] = 0011;
                inputs[1] = 0110;
                int answer = 0;
                for (int i = 0; i < inputCount; i++)
                {
                    answer += inputs[i];  
                }
                string strAns = answer.ToString();
                char[] charAnsArray = strAns.ToCharArray();
                int[] finalAns = new int[charAnsArray.Length];
                char[] finalCharAnsArray = new char[charAnsArray.Length];
                for (int i = 0; i < finalAns.Length; i++)
                {
                    finalAns[i] = (int)charAnsArray[i];
                    finalAns[i] %= 2;
                    finalCharAnsArray[i] = (char)finalAns[i];
                }
                string output = new string(finalCharAnsArray);
                int intOutput = int.Parse(output);
                Console.WriteLine(string.Format("{0:0000}", intOutput));
                Console.WriteLine();
                Console.ReadKey();
            }
        }
    }
    
[/code]

OSはWindows10,  
エディターはVisual Studio2015を使用しています。


CC BY-SA 4.0
2019-01-21T15:50:16.840
52179
2019-01-22T01:24:41.340
21034
question
c#
char配列をstringに変換できない


質問タイトルは「char配列をstringに変換できない」ですが、そもそも入力データが何もかも間違っていて、変換の前提条件が整っていません。

>
[code]

>     inputs[0] = 0011;
>  
[/code]

「2 進数のデータ」とありますが、このコードは10進数のデータです。Visual Studio 2017およびC#
7.0以降であれば[バイナリリテラル](https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-
new/csharp-7#numeric-literal-syntax-improvements)を用いて `0b0011`
とでき、2進数のデータを直接表現できます（10進数の`3`になります）。

>
[code]

>     answer += inputs[i];
>  
[/code]

「排他的論理和(xor)」とありますが、[`+`は加算](https://docs.microsoft.com/ja-
jp/dotnet/csharp/language-reference/operators/addition-
operator)です。[排他的論理和(xor)`^`](https://docs.microsoft.com/ja-
jp/dotnet/csharp/language-reference/operators/xor-operator)を使う必要があります。

* * *

現状の`inputs`を元に解を得るには全く異なるアプローチをとる必要があります。[`Convert.ToInt32()`](https://docs.microsoft.com/ja-
jp/dotnet/api/system.convert.toint32?view=netframework-4.7.2#System_Convert_ToInt32_System_String_System_Int32_)および[`Convert.ToString()`](https://docs.microsoft.com/ja-
jp/dotnet/api/system.convert.tostring?view=netframework-4.7.2#System_Convert_ToString_System_Int32_System_Int32_)では１０進数文字列や２進数文字列を扱えるため、これを用いて基数変換できます。  
また、[`Select()`](https://docs.microsoft.com/ja-
jp/dotnet/api/system.linq.enumerable.select?view=netframework-4.7.2#System_Linq_Enumerable_Select__2_System_Collections_Generic_IEnumerable___0__System_Func___0___1__)や[`Aggrigate()`](https://docs.microsoft.com/ja-
jp/dotnet/api/system.linq.enumerable.aggregate?view=netframework-4.7.2#System_Linq_Enumerable_Aggregate__1_System_Collections_Generic_IEnumerable___0__System_Func___0___0___0__)を使用するとループを分かりやすく表現できます。

[code]

    var inputs = new []{ 0011, 0110 };
    var result = inputs
        .Select(x => Convert.ToInt32(x.ToString(), 2))
        .Aggrigate((x, y) => x ^ y);
    Console.WriteLine(Convert.ToString(result, 2));
    
[/code]


CC BY-SA 4.0
2019-01-21T22:51:59.863
52180
2019-01-22T01:24:41.340
2019-01-22T01:24:41.340
4236
4236
52179
answer