質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

2429閲覧

byte[] の1バイトごとの排他的論理和を00hにする値と計算方法を知りたい

TrainRain

総合スコア20

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

2クリップ

投稿2018/11/30 06:24

こんにちは。

前提・実現したいこと

Windows10を使ってVisual Studo 2017でコンソールアプリケーションのプロジェクトを作っています。

発生している問題・エラーメッセージ

byte[] の1バイトごとの排他的論理和を00hにする値と計算方法を知りたいです。

該当のソースコード

C#

1byte[] bytes = new byte[] { 0x08, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x01 };

試したこと

bytesは本来は9つの要素をもちます。
9つめの値は、byte[] の排他的論理和を00hにする値だそうです。

もし値が二つなら、

C#

1byte[] bytes = new byte[] { 0x08, 0x00 };

なら0x08 != 0x00なので排他的論理和は、真を1、偽を0とすれば0です。0x00です。

9つのときはどう計算していくのでしょう。

(1)0x08, 0x00 => 0x00
(2)結果の0x00, 0x05 => 0x00
(3)結果の0x00, 0x00 => 0x01
(4)結果の0x01, 0x01 => 0x01
(5)結果の0x01, 0x00 => 0x00
(6)結果の0x00, 0x00 => 0x01
(7)結果の0x01, 0x01 => 0x01
(8)結果の0x01, 0x00 => 0x00
なので0x00と、前から順番に比較していけばよいのでしょうか?

結果の値と計算方法を知りたいです。

補足情報(FW/ツールのバージョンなど)

Intel Pentium(R) CPU 4415 Y 1.60GHz RAM 8GB Windows10Pro 64bit 1803 17134.345 Microsoft Visual Studio Community 2017 Version 15.8.5 VisualStudio.15.Release/15.8.5+28010.2036 Microsoft .NET Framework Version 4.7.03056 インストールされているバージョン:Community

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

0x08 != 0x00なので排他的論理和は、真を1、偽を0とすれば0です。0x00です。

  • いいえ0x08です。

  • C#の排他的論理和は^演算子です。

  • x ^ x は常に0です。

  • x ^ y ^ z(x ^ y) ^ zです。

  • したがってx ^ y ^ zが0のときx ^ yzです。

投稿2018/11/30 06:51

編集2018/11/30 06:59
ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TrainRain

2018/11/30 07:12

コメントありがとうございます。 真を1、偽を0としてみると0かとおもいます。 なぜそれが0x08になるのでしょう? 補足していただけると嬉しいです。
ozwk

2018/11/30 07:22

ここで言う排他的論理和が、ビットごとの排他的論理和を指していると考えられるためです。
guest

0

答えは出ているようですが、計算方法の提案として。

csharp

1var ans = bytes.Aggregate((p, c) => (byte)(p ^ c))

投稿2018/11/30 08:05

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TrainRain

2018/12/03 01:04

ありがとうございます。参考にします。
guest

0

ベストアンサー

まず排他的論理和(XOR)の計算が違います。
0x08と0x00の排他的論理和は0x08です。

C#

1byte ans = 0x08 ^ 0x00; 2// 0b00001000 3// 0b00000000 XOR 4// ----------------- 5// 0b00001000 =0x08

と各値をビット演算した結果となります。

あとはループで順番に計算すればよろしいかと。
で、最終的な結果を0にする値は最終結果と同じ値となります。

投稿2018/11/30 06:56

編集2018/11/30 06:58
YAmaGNZ

総合スコア10242

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TrainRain

2018/11/30 07:11

ありがとうございます。 ループの前にまずは試してみようと、 byte answer0 = 0x08 ^ 0x00; byte answer1 = answer0 ^ 0x05; としたところ、2行目のanswer0で「intをbyteに変換できません」とエラーになりました。answer0はbyteのはずなのに、どうしてintになってしまうのでしょう?
TrainRain

2018/11/30 07:16

byte answer1 = (byte)(answer0 ^ 0x05); でいけるっぽい。
TrainRain

2018/11/30 07:41

ありがとうございます。まさにそれを見てました。 今回の計算は、 byte answer0 = 0x08 ^ 0x00; byte answer1 = (byte)(answer0 ^ 0x05); byte answer2 = (byte)(answer1 ^ 0x00); byte answer3 = (byte)(answer2 ^ 0x01); byte answer4 = (byte)(answer3 ^ 0x00); byte answer5 = (byte)(answer4 ^ 0x00); byte answer6 = (byte)(answer5 ^ 0x01); でanswer6は13だったので0x13ということでよいのでしょうか?
YAmaGNZ

2018/11/30 07:47

10進数で13です。16進数で0x0Dとなるはずです。
TrainRain

2018/11/30 07:56

ありがとうございます。なるほど、13は10進数です。見落としていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問