2017-11-18 6 views
0

は、だから私は2つの数値を「マージ」に変な必要性に遭遇しましたビットはtwoの第1ビットであり、第3ビットはoneの第2ビットであり、以下同様である。インターレース2進数

これら二つの数字を持つので:申し訳ありませんが、完全にあなたの質問を読み違え:

01001000 
00010001 

0001001001000010

+0

* int three;最初のビットは1の最初のビット、2番目のビットは2の最初のビット、3番目は2番目のビットなどであり、 '01001000 00010001'の場合は、この '0010000110000001'の説明に従っているはずです**この** '0001001001000010'はありません!私が間違っている? – Yahya

答えて

1

UPDATEことになります。

次のコードが何をすべき

public static int InterlacedMerge(byte low, byte high) 
{ 
    var result = 0; 

    for (var offset = 0; offset < 8; offset++) 
    { 
     var mask = 1 << offset; 
     result |= ((low & mask) | ((high & mask)) << 1) << offset; 
    } 

    return result; 
} 

それはそうそこいじるビットに来るとき、私はおそらくこれを行うには、より効率的な方法で、任意の手段によって、非常にスマートではないと思います。それは、私はこれが仕事をするだろうと思うが、私はそれをテストしていないので、あなたが行うことを確認してください。

P.D:コードには不要な括弧がいくつかありますが、ビット演算子の優先順位についてはわかりませんので、書かれた方法を読みやすくなっています。

アップデート2:ここではそれが簡単に従うことにするために、同じコードもう少し冗長です:私はこれを書いていた一方で

public static int InterlacedMerge(byte low, byte high) 
{ 
    var result = 0; 

    for (var offset = 0; offset < 8; offset++) 
    { 
     //Creates a mask with the current bit set to one: 00000001, 
     //00000010, 00000100, and so on... 
     var mask = 1 << offset; 

     //Creates a number with the current bit set to low's bit value. 
     //All other bits are 0 
     var lowAndMask = low & mask; 

     //Creates a number with the current bit set to high's bit value. 
     //All other bits are 0 
     var highAndMask = high & mask; 

     //Create a merged pair where the lowest bit is the low 's bit value 
     //and the highest bit is high's bit value. 
     var mergedPair = lowAndMask | (highAndMask << 1); 

     //Ors the mergedPair into the result shifted left offset times 
     //Because we are merging two bits at a time, we need to 
     //shift 1 additional time for each preceding bit.        
     result |= mergedPair << offset; 
    } 

    return result; 
} 
+0

@Yahyaその標準的なビットツイディリング。コードをより冗長にして、読みやすくします。 – InBetween

1

@inbetweenは答えました。同様の解決策、異なる表現。

ループを作成する必要があります。 2つの入力のそれぞれに1ビットをテストします。各入力の出力にビットを設定します。 3つの値を1つずつシフトします。おそらくこのようなもの(未テスト):

#define TOPBIT 32768 

for /* 16 times */ 
    if (value1 & 1) out |= TOPBIT; 
    out >>= 1; 

    if (value2 & 1) out |= TOPBIT; 
    out >>= 1; 

    b1 >>= 1; 
    b2 >>= 1;