4

私は別の深夜の脳死の質問があります。実行するのはおそらく簡単ですが、8時間以上のプログラミングの後、締め切りに達した後の様子をご存知でしょう。:)

これが私の質問です。

私は長さ10のブール配列を持っています。これは論理的に別々の部分に分割され、4つの異なる整数ビット配列(ブールとして)を保持します。ターゲット配列は次のとおりです。

bool[] myArray = new bool[10]; 

そして、これが私が挿入したい4つの整数です:

int value1 = 3;  // 2 bits, myArray[0-1], 11
int value2 = 12; // 4 bits, myArray[2-5], 1100
int value3 = 2;  // 2 bits, myArray[6-7], 10
int value4 = 1;  // 2 bits, myArray[8-9], 01

myArrayは次のようになります(最初の要素は位置0であることに注意してください)。

{(T,T),(T,T,F,F),(T,F),(F,T)}

次に、最終的に私がやりたいのは、myArrayをint値に変換することです。

0x1111001001 = 969

おそらく、ブール値を使用せずにこれを行うさらに良い方法がありますか?それでは、私の質問をより一般的な意味で言い換えさせてください。

N個のint値をターゲットintに連結するにはどうすればよいですか?

ありがとう!

4

2 に答える 2

1

通常、複数の数値のビットを1つに結合する一般的な方法は、次のとおりです(値とビット長を例として使用)。

var result = value1 | (value2 << 2) | (value3 << 6) | (value4 << 8);

ただし、質問の最後に印刷した番号には、後ろから前に番号が付いています。それがあなたが望むものなら、それは次のようになります:

var result = value4 | (value3 << 2) | (value2 << 4) | (value1 << 8);

もちろん、これはコードが各値の目的のビット長を知っていることを前提としています。コンパイル時にビット長がわからない場合は、実行時にビット長を追跡する必要があります。そうしないと、1つのintのよう1に、コードから使用するビット数がわかりません。

于 2012-12-02T09:54:37.083 に答える
0

これは、整数のbinaray表現を連結するコードを記述しようとする試みです。ここで、バイナリ表現に先行ゼロはありません。

static int Concat(int high, int low)
{
  // find location i of most significant bit of "low"
  int i;
  for (i = 31; i > -1; --i)
    if ((low & (1 << i)) != 0)
      break;

  if (i == 31)
    return low;
  return low & (high << (i + 1));
}

static int ConcatMany(IEnumerable<int> values)
{
  return values.Aggregate(Concat);
}

これは次のように使用する必要があります。

int concatOfTwoNumbers = Concat(3, 12);

var list = new List<int> { 3, 12, 2, 1, };
int concatOfList = ConcatMany(list);

もちろん、連結に32ビットを超える場合、最上位ビットは左側に「フォールオフ」します。64ビット整数で使用するには、highlowlongに変更し、両方31をに変更し63ます。

于 2012-12-02T13:39:21.443 に答える