2

長さが5ビットの値があります。4 ビットが数値を決定し、5 番目のビットが符号を決定するため、-16 から +15 までの任意の値を保持します。C# で一定の​​ビット幅から符号拡張を行うにはどうすればよいですか? 私はCで知っています、これを達成するために次のようなものを使うことができます:

int x; // convert this from using 5 bits to a full int
int r; // resulting sign extended number goes here
struct {signed int x:5;} s;
r = s.x = x;

C#でこれと似たようなことをするにはどうすればよいですか?

4

5 に答える 5

3

あなたが何を意味するのかは明確ではありませんが、次のよう簡単に言えます。

int fiveBits = normal & 0x1f;

逆の場合:

int normal =  fiveBits < 16 ? fiveBits : fiveBits | -32;

元の入力と望ましい出力を提案できれば、それが役立ちます。

于 2010-10-20T18:38:22.383 に答える
2

I'm just writing a C function (because I don't really know C#) that will do this using operations that I know are available in C#.

int five_bit_to_signed(int five_bit) {
     int sh = (sizeof(int)*8)-5;
     int x = five_bit << sh; // puts your sign bit in the highest bit.
     return x >> sh;  // since x is signed this is an arithmatic signed shift
}
于 2010-10-20T19:25:23.383 に答える
2

これは古い質問であることはわかっていますが、将来の検索者のために、より多くの情報があります。

C# はカスタム ビット幅をサポートしていませんが、バイナリ操作とゲッター/セッターをサポートしているため、互換レイヤーを比較的簡単に追加できます。たとえば、生データを byte _num に格納したいが、標準の C# sbyte を使用して対話できるようにしたい場合は、次を使用できます。

byte _num;
sbyte num {
    get
    {
        return (sbyte)(((_num & 0x10) << 3) | (_num & 0x0F));
    }
    set
    {
        _num = (byte)((value & 0x0F) | ((value & 0x80) >> 3));
    }
}

この種のシェルは、低レベルのファームウェアまたは組み込みプロジェクトと対話する場合に特に役立ちます。

于 2012-06-06T15:14:33.350 に答える
1

左シフトに続いて算術右シフトを実行して、符号ビットを上位位置に移動してから元に戻します。算術右シフトは、符号拡張を実行します。

もちろん、これは算術シフト演算が機能しているかどうかに依存します。抽象 C 言語はそうではありません (動作するかどうかは実装定義です) が、ほとんどの実装では動作します。C#についてはよくわかりませんが、あると思います。

于 2010-10-20T19:07:37.337 に答える
0

あなたの質問から、あなたはタイプとの間で簡単に変換できる構造を持ちたいようですint

struct FiveBit
{
  public int bits;

  public static implicit operator int(FiveBit f)
  {
    return (f.bits & 0x10) == 0 ? f.bits : f.bits | -32;
  }

  public static implicit operator FiveBit(int r)
  {
    return new FiveBit() { bits = r & 0x1f };
  }
}

そして、これが使用例です:

class FiveBitTest
{
  static void Main(string[] args)
  {
    FiveBit f = new FiveBit();
    int r; // resulting sign extended number goes here

    f.bits = 0;
    r = f;
    Console.WriteLine("r = {0}, f.bits = 0x{1:X}", r, f.bits);

    f.bits = 0x1f;
    r = f;
    Console.WriteLine("r = {0}, f.bits = 0x{1:X}", r, f.bits);

    r = -2;
    f = r;
    Console.WriteLine("r = {0}, f.bits = 0x{1:X}", r, f.bits);
}

上記の出力は次のとおりです。

r = 0, f.bits = 0x0
r = -1, f.bits = 0x1F
r = -2, f.bits = 0x1E
于 2012-03-29T08:41:21.163 に答える