gpt4 book ai didi

c - 如何将 if else 代码最小化为按位

转载 作者:行者123 更新时间:2023-11-30 15:17:29 27 4
gpt4 key购买 nike

是否可以简化此语句?

如果我使用 case 语句和 while 循环,效果是相同的。

void decode (unsigned char* msg) {


if (strstr (msg, "DO=0x00") != NULL) // 0
{
//00000
LATGbits.LATG1 = 0 ; //DO1 OFF
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 1 ; //DO3 OFF
LATGbits.LATG14 = 1 ; //DO4 OFF
LATGbits.LATG12 = 1 ; //DO5 OFF
}
else if (strstr (msg, "DO=0x01") != NULL)// 1
{
//00001
LATGbits.LATG1 = 1 ; //DO1 ON
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 1 ; //DO3 OFF
LATGbits.LATG14 = 1 ; //DO4 OFF
LATGbits.LATG12 = 1 ; //DO5 OFF
}
else if (strstr (msg, "DO=0x02") != NULL)// 2
{
//00010
LATGbits.LATG1 = 0 ; //DO1 OFF
LATGbits.LATG0 = 0 ; //DO2 ON
LATGbits.LATG13 = 1 ; //DO3 OFF
LATGbits.LATG14 = 1 ; //DO4 OFF
LATGbits.LATG12 = 1 ; //DO5 OFF
}
else if (strstr (msg, "DO=0x03") != NULL)// 3
{
//00011
LATGbits.LATG1 = 1 ; //DO1 ON
LATGbits.LATG0 = 0 ; //DO2 ON
LATGbits.LATG13 = 1 ; //DO3 OFF
LATGbits.LATG14 = 1 ; //DO4 OFF
LATGbits.LATG12 = 1 ; //DO5 OFF
}
else if (strstr (msg, "DO=0x04") != NULL)// 4
{
//00100
LATGbits.LATG1 = 0 ; //DO1 OFF
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 0 ; //DO3 ON
LATGbits.LATG14 = 1 ; //DO4 OFF
LATGbits.LATG12 = 1 ; //DO5 OFF
}
else if (strstr (msg, "DO=0x05") != NULL)// 5
{
//00101
LATGbits.LATG1 = 1 ; //DO1 ON
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 0 ; //DO3 ON
LATGbits.LATG14 = 1 ; //DO4 OFF
LATGbits.LATG12 = 1 ; //DO5 OFF
}
else if (strstr (msg, "DO=0x06") != NULL)// 6
{
//00110
LATGbits.LATG1 = 0 ; //DO1 OFF
LATGbits.LATG0 = 0 ; //DO2 ON
LATGbits.LATG13 = 0 ; //DO3 ON
LATGbits.LATG14 = 1 ; //DO4 OFF
LATGbits.LATG12 = 1 ; //DO5 OFF
}
else if (strstr (msg, "DO=0x07") != NULL)// 7
{
//00111
LATGbits.LATG1 = 1 ; //DO1 ON
LATGbits.LATG0 = 0 ; //DO2 ON
LATGbits.LATG13 = 0 ; //DO3 ON
LATGbits.LATG14 = 1 ; //DO4 OFF
LATGbits.LATG12 = 1 ; //DO5 OFF
}
else if (strstr (msg, "DO=0x08") != NULL)// 8
{
//01000
LATGbits.LATG1 = 0 ; //DO1 OFF
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 1 ; //DO3 OFF
LATGbits.LATG14 = 0 ; //DO4 ON
LATGbits.LATG12 = 1 ; //DO5 OFF
}
else if (strstr (msg, "DO=0x09") != NULL)// 9
{
//01001
LATGbits.LATG1 = 1 ; //DO1 ON
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 1 ; //DO3 OFF
LATGbits.LATG14 = 0 ; //DO4 ON
LATGbits.LATG12 = 1 ; //DO5 OFF
}
else if (strstr (msg, "DO=0x0A") != NULL)// 10
{
//01010
LATGbits.LATG1 = 1 ; //DO1 OFF
LATGbits.LATG0 = 1 ; //DO2 ON
LATGbits.LATG13 = 1 ; //DO3 OFF
LATGbits.LATG14 = 0 ; //DO4 ON
LATGbits.LATG12 = 1 ; //DO5 OFF
}
else if (strstr (msg, "DO=0x0B") != NULL)// 11
{
//01011
LATGbits.LATG1 = 1 ; //DO1 ON
LATGbits.LATG0 = 0 ; //DO2 ON
LATGbits.LATG13 = 1 ; //DO3 OFF
LATGbits.LATG14 = 0 ; //DO4 ON
LATGbits.LATG12 = 1 ; //DO5 OFF
}
else if (strstr (msg, "DO=0x0C") != NULL)// 12
{
//01100
LATGbits.LATG1 = 0 ; //DO1 OFF
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 1 ; //DO3 OFF
LATGbits.LATG14 = 0 ; //DO4 ON
LATGbits.LATG12 = 0 ; //DO5 ON
}
else if (strstr (msg, "DO=0x0D") != NULL)// 13
{
//01101
LATGbits.LATG1 = 1 ; //DO1 ON
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 0 ; //DO3 ON
LATGbits.LATG14 = 0 ; //DO4 ON
LATGbits.LATG12 = 1 ; //DO5 OFF
}
else if (strstr (msg, "DO=0x0E") != NULL)// 14
{
//01110
LATGbits.LATG1 = 0 ; //DO1 OFF
LATGbits.LATG0 = 0 ; //DO2 ON
LATGbits.LATG13 = 0 ; //DO3 ON
LATGbits.LATG14 = 0 ; //DO4 ON
LATGbits.LATG12 = 1 ; //DO5 OFF
}
else if (strstr (msg, "DO=0x0F") != NULL)// 15
{
//01111
LATGbits.LATG1 = 1 ; //DO1 ON
LATGbits.LATG0 = 0 ; //DO2 ON
LATGbits.LATG13 = 0 ; //DO3 ON
LATGbits.LATG14 = 0 ; //DO4 ON
LATGbits.LATG12 = 1 ; //DO5 OFF
}
else if (strstr (msg, "DO=0x10") != NULL)// 16
{
//10000
LATGbits.LATG1 = 0 ; //DO1 OFF
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 1 ; //DO3 OFF
LATGbits.LATG14 = 1 ; //DO4 OFF
LATGbits.LATG12 = 0 ; //DO5 O1
}
else if (strstr (msg, "DO=0x11") != NULL)// 17
{
//10001
LATGbits.LATG1 = 1 ; //DO1 ON
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 1 ; //DO3 OFF
LATGbits.LATG14 = 1 ; //DO4 OFF
LATGbits.LATG12 = 0 ; //DO5 ON
}
else if (strstr (msg, "DO=0x12") != NULL)// 18
{
//10010
LATGbits.LATG1 = 0 ; //DO1 OFF
LATGbits.LATG0 = 0 ; //DO2 ON
LATGbits.LATG13 = 1 ; //DO3 OFF
LATGbits.LATG14 = 1 ; //DO4 OFF
LATGbits.LATG12 = 0 ; //DO5 ON
}
else if (strstr (msg, "DO=0x13") != NULL)// 19
{
//10011
LATGbits.LATG1 = 1 ; //DO1 ON
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 1 ; //DO3 OFF
LATGbits.LATG14 = 0 ; //DO4 ON
LATGbits.LATG12 = 0 ; //DO5 ON
}
else if (strstr (msg, "DO=0x14") != NULL)// 20
{
//10100
LATGbits.LATG1 = 0 ; //DO1 OFF
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 0 ; //DO3 ON
LATGbits.LATG14 = 1 ; //DO4 OFF
LATGbits.LATG12 = 0 ; //DO5 ON
}
else if (strstr (msg, "DO=0x15") != NULL)// 21
{
//10101
LATGbits.LATG1 = 1 ; //DO1 ON
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 0 ; //DO3 ON
LATGbits.LATG14 = 1 ; //DO4 OFF
LATGbits.LATG12 = 0 ; //DO5 ON
}
else if (strstr (msg, "DO=0x16") != NULL)// 22
{
//10110
LATGbits.LATG1 = 0 ; //DO1 OFF
LATGbits.LATG0 = 0 ; //DO2 ON
LATGbits.LATG13 = 0 ; //DO3 ON
LATGbits.LATG14 = 1 ; //DO4 OFF
LATGbits.LATG12 = 0 ; //DO5 ON
}
else if (strstr (msg, "DO=0x17") != NULL)// 23
{
//10111
LATGbits.LATG1 = 1 ; //DO1 ON
LATGbits.LATG0 = 0 ; //DO2 ON
LATGbits.LATG13 = 0 ; //DO3 ON
LATGbits.LATG14 = 1 ; //DO4 OFF
LATGbits.LATG12 = 0 ; //DO5 ON
}
else if (strstr (msg, "DO=0x18") != NULL)// 24
{
//11000
LATGbits.LATG1 = 0 ; //DO1 OFF
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 1 ; //DO3 OFF
LATGbits.LATG14 = 0 ; //DO4 ON
LATGbits.LATG12 = 0 ; //DO5 ON
}
else if (strstr (msg, "DO=0x19") != NULL)// 25
{
//11001
LATGbits.LATG1 = 1 ; //DO1 ON
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 1 ; //DO3 OFF
LATGbits.LATG14 = 0 ; //DO4 ON
LATGbits.LATG12 = 0 ; //DO5 ON
}
else if (strstr (msg, "DO=0x1A") != NULL)// 26
{
//11010
LATGbits.LATG1 = 0 ; //DO1 OFF
LATGbits.LATG0 = 0 ; //DO2 ON
LATGbits.LATG13 = 1 ; //DO3 OFF
LATGbits.LATG14 = 0 ; //DO4 ON
LATGbits.LATG12 = 0 ; //DO5 ON
}
else if (strstr (msg, "DO=0x1B") != NULL)// 27
{
//11011
LATGbits.LATG1 = 1 ; //DO1 ON
LATGbits.LATG0 = 0 ; //DO2 ON
LATGbits.LATG13 = 1 ; //DO3 OFF
LATGbits.LATG14 = 0 ; //DO4 ON
LATGbits.LATG12 = 0 ; //DO5 ON
}
else if (strstr (msg, "DO=0x1C") != NULL)// 28
{
//11100
LATGbits.LATG1 = 0 ; //DO1 OFF
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 0 ; //DO3 ON
LATGbits.LATG14 = 0 ; //DO4 ON
LATGbits.LATG12 = 0 ; //DO5 ON
}
else if (strstr (msg, "DO=0x1D") != NULL)//29
{
//11101
LATGbits.LATG1 = 1 ; //DO1 ON
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 0 ; //DO3 ON
LATGbits.LATG14 = 0 ; //DO4 ON
LATGbits.LATG12 = 0 ; //DO5 ON
}
else if (strstr (msg, "DO=0x1E") != NULL)// 30
{
//11110
LATGbits.LATG1 = 0 ; //DO1 OFF
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 0 ; //DO3 ON
LATGbits.LATG14 = 0 ; //DO4 ON
LATGbits.LATG12 = 0 ; //DO5 ON
}
else if (strstr (msg, "DO=0x1F") != NULL)// 31
{
//11111
LATGbits.LATG1 = 1 ; //DO1 ON
LATGbits.LATG0 = 0 ; //DO2 ON
LATGbits.LATG13 = 0 ; //DO3 ON
LATGbits.LATG14 = 0 ; //DO4 ON
LATGbits.LATG12 = 0 ; //DO5 ON
}
}

上面的代码显示,当在 super 终端中写入该字时,它会对 LED 进行一些操作。例如,DO=0x1F 将打开所有五个 LED。因为,基于0x1F的二进制是IIIIII(5-Bit)。有什么方法可以使用 Bitwise 函数简化代码吗?

最佳答案

我不会为您编写代码,但解决问题的方法如下:

  1. 构建并硬编码一个包含 32 个值的查找表,其中包含每个十六进制值所需的位标志,存储为 int
  2. 解析 msg 并提取十六进制值 (0x00 - 0x1F) 作为 int
  3. 使用步骤 到 中的值作为表中的索引来选择所需的位(int)
  4. 根据需要将这些值应用于 LATGbits 结构成员。

关于c - 如何将 if else 代码最小化为按位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32430529/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com