2012-03-23 55 views
2

我有一個字節A和字節B.我正在尋找字節C,它是來自A的每隔一個位和來自B的每一個其他位。所以如果A = 10011010並且B = 01110010,那麼C將是10110101其中1011是來自A的其他位,0101是來自B的每隔一位。任何人都可以幫助我解決這個問題嗎?合併2個字節

回答

2

試試這個:

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)); 

看到它聯機工作:ideone

0

像這樣的東西應該這樣做:

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; 

對於每個輸入字節你把 「第一次」(實際上通常從另一端開始計算,但我會用這個聽起來更直接的字節),將它移到3個位置(爲其他位置留出空間),添加「thi rd「字節(將它移到兩個地方)等等。

然後,您將第一個半字節移到剛剛計算出的四個位置(爲第二個空間)並將它們粘在一起。

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; 

讓我想想看一小會兒,這可以更有效的進行......

還有一句:

$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; 

...而現在的通知C#標記...