正在组合2个字节

本文关键字:字节 2个 组合 | 更新日期: 2023-09-27 18:28:55

我有一个字节a和字节B。我正在寻找字节C,它是来自a的每隔一位,也是来自B的每隔一个位。所以,如果a=10011010,B=01110010,那么C将是10110101,其中1011是来自a,0101是来自B的每一位。有人能帮我吗?

正在组合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

应该这样做:

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位(为其他字节腾出空间),添加"第三个"字节,(将其移位两位)等。

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

$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#标签。。。