Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将一个热编码转换为普通二进制_C++_One Hot Encoding - Fatal编程技术网

C++ 将一个热编码转换为普通二进制

C++ 将一个热编码转换为普通二进制,c++,one-hot-encoding,C++,One Hot Encoding,这不是一个常规的“二进制到bcd”的问题,事实上,我真的不确定我要做的事情叫什么 嵌入式设备中有一个字节,它以以下格式存储数字1到7(一周中的几天): 00000001 = 1 00000010 = 2 00000100 = 3 00001000 = 4 00010000 = 5 00100000 = 6 01000000 = 7 我想读取这个字节,并将其内容(1到7)转换为BCD,但我不确定如何执行此操作 我知道我可以用一系列的if语句来强制它: if(byte == B00000001)

这不是一个常规的“二进制到bcd”的问题,事实上,我真的不确定我要做的事情叫什么

嵌入式设备中有一个字节,它以以下格式存储数字1到7(一周中的几天):

00000001 = 1
00000010 = 2
00000100 = 3
00001000 = 4
00010000 = 5
00100000 = 6
01000000 = 7
我想读取这个字节,并将其内容(1到7)转换为BCD,但我不确定如何执行此操作


我知道我可以用一系列的if语句来强制它:

if(byte == B00000001) 
{
    answer = 1; 
}
else
if(byte == B00000010) 
{
    answer = 2; 
}

等等,但我认为还有更好的办法。该数据存储在实时时钟上的单个寄存器中。我通过执行I2C读取得到这个字节,然后在我的程序中将它读入一个字节。此实时时钟的数据表指定此特定寄存器的格式如上文所述。

您可以使用查找表

/* this is only needed once, if lut is global or static */
unsigned char lut[65];
lut[1]=1;
lut[2]=2;
lut[4]=3;
lut[8]=4;
lut[16]=5;
lut[32]=6;
lut[64]=7;

...
...
...

/* Perform the conversion */
answer = lut[byte];
或者你甚至可以用一些数学

answer = 1 + log(byte)/log(2);

您可以使用查找表

/* this is only needed once, if lut is global or static */
unsigned char lut[65];
lut[1]=1;
lut[2]=2;
lut[4]=3;
lut[8]=4;
lut[16]=5;
lut[32]=6;
lut[64]=7;

...
...
...

/* Perform the conversion */
answer = lut[byte];
或者你甚至可以用一些数学

answer = 1 + log(byte)/log(2);

如果这是在ARM处理器上编译的,您只需执行以下操作:

result = 31 - __CLZ(number);

假设
number
是一个
32位单热>0

如果这是在ARM处理器上编译的,您只需执行以下操作:

result = 31 - __CLZ(number);

假设
number
是一个
32位单热>0

您可以使用按位和模运算来高效地执行此操作,而无需创建大型数组

for (int answer = 1; (byte % 2) == 0; ++answer) {
    byte >>= 1;
}

(我知道这是一个老问题,我只想与大家分享,因为这对我来说是一个很高的谷歌搜索结果)

您可以使用按位和模运算来高效地完成此操作,而无需创建大型数组

for (int answer = 1; (byte % 2) == 0; ++answer) {
    byte >>= 1;
}

(我知道这是一个老问题,我只想与大家分享,因为这对我来说是一个很高的谷歌搜索结果)

你尝试过什么吗?我知道如果(byte==00000001)answer=1,我可以用一系列if语句来强制执行它;如果(字节==00000010)答案=2;等等,但我认为还有更好的办法。此数据存储在实时时钟提示上的单个寄存器中:您具有two@EdHeal:“single byte”@DylanCrockern 01000000b不是7你试过什么吗?我知道如果(byte==00000001)answer=1,我可以用一系列if语句来强制它;如果(字节==00000010)答案=2;等等,但我认为还有更好的办法。此数据存储在实时时钟提示上的单个寄存器中:您具有two@EdHeal:“single byte”@DylanCrockern 01000000b不是7b我甚至没有使用对数!这看起来是最容易实现的,谢谢!再想一想,由于我在从事嵌入式系统的工作,速度是非常重要的。您知道上面列出的哪些方法对于8位16MHz处理器来说更快吗?我有一种感觉,计算两个对数和一个除法将比查找花费更长的时间table@user3211203看看我留下的关于你问题的链接。这是计算以2为底整数对数的最快方法。@user3211203:毫无疑问,这是第一种(LUT)方法。您可以将LUT放在代码内存中,它通常比数据内存大。如果您在声明中初始化它,它将从第一个时钟周期开始准备就绪。要使用它,它只是一个使用索引读取的代码内存,这可能需要几个周期(在8051类微控制器上大约4-5个周期),我甚至没有使用对数!这看起来是最容易实现的,谢谢!再想一想,由于我在从事嵌入式系统的工作,速度是非常重要的。您知道上面列出的哪些方法对于8位16MHz处理器来说更快吗?我有一种感觉,计算两个对数和一个除法将比查找花费更长的时间table@user3211203看看我留下的关于你问题的链接。这是计算以2为底整数对数的最快方法。@user3211203:毫无疑问,这是第一种(LUT)方法。您可以将LUT放在代码内存中,它通常比数据内存大。如果您在声明中初始化它,它将从第一个时钟周期开始准备就绪。要使用它,它只是使用索引读取代码内存,可能需要几个周期(在8051类微控制器上大约需要4-5个周期)