2012-03-23 20 views
2

Ich habe ein Byte A und Byte B. Ich suche Byte C, das ist jedes andere Bit von A und jedes andere Bit von B. Also wenn A = 10011010 und B = 01110010 dann wäre C 10110101 wo 1011 ist jedes zweite Bit von A und 0101 ist jedes zweite Bit von B. Kann mir jemand dabei helfen?Kombinieren von 2 Bytes

Antwort

2

Try this:

byte C = (byte)(
    (A & 0x80) | 
    ((A & 0x20) << 1) | 
    ((A & 0x08) << 2) | 
    ((A & 0x02) << 3) | 
    ((B & 0x80) >> 4) | 
    ((B & 0x20) >> 3) | 
    ((B & 0x08) >> 2) | 
    ((B & 0x02) >> 1)); 

es Siehe Arbeits online: ideone

0

So etwas sollte es tun:

var nibble1 = ((a & 0x80) << 3) | ((a & 0x20) << 2) | 
       ((a & 0x08) << 1) | (a & 0x02); 
var nibble2 = ((b & 0x80) << 3) | ((b & 0x20) << 2) | 
       ((b & 0x08) << 1) | (b & 0x02); 

var result = (nibble1 << 4) | nibble2; 

Für jedes Eingangsbyte Sie das nehmen "erste" (eigentlich Es ist üblich, vom anderen Ende aus zu zählen, aber ich werde damit gehen, das klingt hier einfacher) Byte, verschiebe es um 3 Stellen (um hinter den anderen Platz zu machen), füge das "Thi" hinzu rd "byte (verschiebt es zwei Plätze) etc.

Dann schiebst du das erste Nibble, das du gerade vier Plätze berechnet hast (um Platz für das zweite zu schaffen) und klebst sie zusammen.

0
$a = 154; //10011010 
$b = 114; //01110010 

$expected = 181; //10110101 

$result = (($a>>1)&1)+(($a>>2)&2)+(($a>>3)&4)+(($a>>4)&8) << 4 
      | (($b>>1)&1)+(($b>>2)&2)+(($b>>3)&4)+(($b>>4)&8); 


echo $expected == $result; 

Lassen Sie mich darüber nachdenken, es für eine kleine Weile, dies effizient mehr getan werden könnte ...

Ein anderes:

$a = 154; //10011010 
$b = 114; //01110010 

$expected = 181; //10110101 

$result = ($a&0x80)+(($a<<1)&0x40)+(($a<<2)&0x20)+(($a<<3)&0x10)+ 
     (($b>>4)&0x8)+(($b>>3)&0x4)+(($b>>2)&0x2)+(($b>>1)&0x1); 

echo $expected == $result; 

... Und jetzt Ich stelle fest, die C# tag ...