2012-03-23 75 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#标记...