在Arduino C中将两个二进制数交织在一起

Interlacing two binary numbers together in Arduino C

所以我遇到了一个奇怪的需要 'merge' 两个数字:

byte one;
byte two;

变成一个int three;,第一位是[=14=的第一位,第二位是[=15=的第一位],第三位是[=的第二位14=] 等等。

所以有了这两个数字:

01001000
00010001

会导致

0001001001000010


隔行扫描操作的更详细的说明:

byte one = 0  1  0  0  1  0  0  0
byte two = 0  0  0  1  0  0  0  1
result   = 00 01 00 10 01 00 00 10

更新:抱歉完全误读了您的问题。

应执行以下代码:

public static int InterlacedMerge(byte low, byte high)
{
    var result = 0;

    for (var offset = 0; offset < 8; offset++)
    {
        var mask = 1 << offset;
        result |= ((low & mask) | ((high & mask)) << 1) << offset;
    }

    return result;
}

无论如何,我在位操作方面都不是很聪明,所以可能有更有效的方法来做到这一点。也就是说,我认为这可以完成工作,但我还没有测试过,所以请务必这样做。

P.D: 代码中有一些不必要的括号,但我不确定按位运算符的优先级,所以我发现它的编写方式更容易阅读。

更新 2:这里是相同的代码,为了更容易理解,这里更详细一些:

public static int InterlacedMerge(byte low, byte high)
{
    var result = 0;

    for (var offset = 0; offset < 8; offset++)
    {
        //Creates a mask with the current bit set to one: 00000001,
        //00000010, 00000100, and so on...
        var mask = 1 << offset; 

        //Creates a number with the current bit set to low's bit value.
        //All other bits are 0
        var lowAndMask = low & mask; 

        //Creates a number with the current bit set to high's bit value.
        //All other bits are 0
        var highAndMask = high & mask; 

        //Create a merged pair where the lowest bit is the low 's bit value
        //and the highest bit is high's bit value.
        var mergedPair = lowAndMask | (highAndMask << 1);

        //Ors the mergedPair into the result shifted left offset times
        //Because we are merging two bits at a time, we need to
        //shift 1 additional time for each preceding bit.                              
        result |= mergedPair << offset;
    }

    return result;
}

@inbetween 在我写这篇文章的时候回答了;相似的解决方案,不同的措辞。

你必须写一个循环。您将在两个输入中的每一个中测试一位。您将在每个输入的输出中设置一个位。您会将所有三个值移动一个位置。也许是这样的(未经测试):

#define TOPBIT 32768

for /* 16 times */
    if ( value1 & 1 )  out |= TOPBIT;
    out >>= 1;

    if ( value2 & 1 )  out |= TOPBIT;
    out >>= 1;

    b1 >>= 1;
    b2 >>= 1;