组合2个字节

时间:2012-03-23 21:49:38

标签: c# byte bit-manipulation

我有一个字节A和字节B.我正在寻找字节C,它是来自A的每隔一位和来自B的每隔一位。所以如果A = 10011010且B = 01110010那么C将是10110101,其中1011是每个来自A和0101的其他位是来自B的其他位。任何人都可以帮我这个吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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个位置(为它留下空间)其他),添加“第三”字节(将其移动两个位置)等。

然后你移动你刚刚计算出四个位置的第一个半字节(为第二个空间腾出空间)并将它们粘在一起。

答案 2 :(得分: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#标签......