我有一个字节A和字节B.我正在寻找字节C,它是来自A的每隔一位和来自B的每隔一位。所以如果A = 10011010且B = 01110010那么C将是10110101,其中1011是每个来自A和0101的其他位是来自B的其他位。任何人都可以帮我这个吗?
答案 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#标签......