Объединение 2 байтов - PullRequest
       18

Объединение 2 байтов

2 голосов
/ 24 марта 2012

У меня есть байт A и байт B. Я ищу байт C, который является каждым другим битом из A и каждым другим битом из B. Поэтому, если A = 10011010 и B = 01110010, то C будет 10110101, где 1011 - это каждый другой бит от A и 0101 - это любой другой бит от B. Кто-нибудь может мне помочь с этим?

Ответы [ 3 ]

2 голосов
/ 24 марта 2012

Попробуйте это:

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 голосов
/ 24 марта 2012
$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 # ...

0 голосов
/ 24 марта 2012

Что-то вроде этого должно сделать это:

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 места (чтобы освободить место для него для остальные), добавьте «третий» байт (сдвинув его на два места) и т. д.

Затем вы сдвигаете первый клев, вы только что вычислили четыре места (чтобы освободить место для второго) и склеили их вместе.

...