6

だから私はバイト配列から12ビット整数を読んでいます。その数値は負になる可能性がありますが、それをC#で使用可能な変数int16/int32に変換する方法がわかりません。ビットシフトやその他のビット単位の操作で何かをする必要があると感じていますが、これまでのところ私は打ちのめされています。誰かが私を正しい方向に向けることができますか?

var x = 0xFFF;

これは -1 として出力する必要がありますが、c# は自然に int32 にキャストし、4095 として出力します。これを int16 または int32 にキャストする必要がある場合、負の値を保持するにはどうすればよいですか。

4

3 に答える 3

13

32 ビット:

x = (x >> 11) == 0 ? x : -1 ^ 0xFFF | x;
于 2012-06-04T04:25:37.697 に答える
8

x12 ビット値を既に含む符号付き短整数型であると仮定すると、条件なしの符号拡張:

x = (x << 4) >> 4;

括弧は純粋に何が起こっているのかを理解するためのものです。ビット シフトは、他の算術演算子や論理演算子と同様に左結合です。これが機能する理由>>は、符号付き型の算術右シフトです。つまり、最上位ビットでゼロをシフトインする代わりに、必要な回数だけ MSB を複製します。

n一般に、ビットからビットへの符号拡張は次のmようになります。

x = (x << (m - n)) >> (m - n);

明らかな理由により、 は 8 個、は 16 個、は 32 個、 は64 個mに制限されます。繰り返しますが、括弧は純粋に表面的なものです。減算は、ビット シフトよりも厳密にバインドされます。sbyteshortintlong

于 2012-06-04T05:05:22.460 に答える
1

符号ビットを検出して拡張します。16 ビットの場合:

x = ( x & 0x800 ? x | 0xf000 : x );
于 2015-09-18T06:11:39.357 に答える