在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;
所以我遇到了一个奇怪的需要 '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;