0

C# でいくつかのコードを分析しようとしています。数値の変換に誤解の問題があり、C# コードの AND 演算に問題がある可能性があります。以下に示すようなコードがあります。

        public void SerialNumber(UInt32 number)
    {
        _sensorNumber=0;
        if (number == 0)
            number = (UInt32)(USB.Id << 16) | (_sensorNumber << 10) | 1;

        SerialNumber = string.Format("{0}-{1}-{2}",
            (number & 0xFFFF0000) >> 16,
            (number & 0x0000FC00) >> 10,
            number & 0x000003FF);
    }

このコードの機能を明確に説明できる人はいますか? 「SerialNumber」行に説明が必要です。このコードをデバッグしようとしたとき、2 つの異なる状況が観察されました。

1)私が番号を持っているとき= 65668097; 次に、「SerialNumber = 1002-0-1」を取得しています

2) 番号 = 0 の場合。USB.Id = 15152; を取得しています。その後、どのような操作が行われているのか理解できず、最終的に number= 993001473 となり、"SerialNumber = 15152-0-1

AND、OR演算で何が起こっているのか誰か説明してください。

4

2 に答える 2

2

&and|はそれぞれ論理的andおよびorです。つまり、2 つの数値で実行すると、それらのビット表現が論理的に比較され、結果が得られます。例えば:

101011 と 110010 = 100010

101011 または 110010 = 111011

>>はビットシフト演算子であり、それに続く数字は実行すべきシフト数を示します。ここでそれについて読むことができます: http://www.blackwasp.co.uk/CSharpShiftOperators.aspx

始めるのに役立つことを願っています。

編集:わからない場合。0xFFFF0000 は数値の 16 進数表現です。詳細はこちら: http://en.wikipedia.org/wiki/Hexadecimal

于 2013-05-16T12:02:00.077 に答える
0

そのコードをよりよく理解するために、数値を 16 進形式で表示することをお勧めします。

シリアル番号 (数値または文字列として) は、USB ID、センサー番号、およびその他の 3 つの異なるものの組み合わせ (単一の整数でエンコード) です。USB Id は最初の 16 ビットを占有し、センサー番号は次の 6 ビットを占め、10 ビットの最後の部分があります (16+10+6 = 32 ビット = sizeof(UInt32)): 0xFFFF0000 は最初の 16 ビットのマスクです (0xFFFF) = 2^16-1)、次の 6 ビットは 0xFC00、最後の 10 ビットは 0x3FF (0x3FF = 1023 = 2^10 - 1、0xFFFF = 0xFC00 + 0x3FF)。

簡単に言えば、「ビット単位の AND」(&) は完全な整数から 3 つの部分を分離するためにあり、「ビット単位の OR」(|) はその部分から数値を元に戻すためにあります。

于 2013-05-16T12:18:49.340 に答える