我有3个传感器,每个传感器提供0或1(循环重复)。它们作为int
变量单独存储。然后使用以下内容打印这些:
print ("%d%d%d", Sensor1, Sensor2, Sensor3);
我想暂时存储每个组合(例如:010,001,110等)以便我可以使用它做其他事情(我希望有一个开关或最终我可以做不同操作的东西,具体取决于传感器组合的价值)。我无法将其存储为int,因为它会丢弃前面的0。
如何存储这些组合?
答案 0 :(得分:1)
您可以使用结构bit field。
struct Bit{
bool Sensor1 : 1;
bool Sensor2 : 1;
bool Sensor3 : 1;
};
int main(void)
{
struct Bit bit = {0, 1, 0};
printf ("%d%d%d", bit.Sensor1, bit.Sensor2, bit.Sensor3);
}
答案 1 :(得分:1)
所以你有
int Sensor1, Sensor2, Sensor3;
// have code to initialize above variables to 0 or 1
要将它们存储为基数10中的一个整数,假设它们实际上都是0或1,您可以这样做:
int Sensors_10 = Sensor1 * 100 + Sensor2 * 10 + Sensor3;
然后让他们回来:
Sensor1 = Sensors_10 / 100 % 10;
Sensor2 = Sensors_10 / 10 % 10;
Sensor3 = Sensors_10 % 10;
显然传感器的顺序可以是任何,只要它在打包和拆包之间匹配。
但是,您只需要1位来存储每个传感器,因此可以使用二进制文件:
int Sensors_2 = Sensor1 * 4 + Sensor2 * 2 + Sensor3;
...
Sensor1 = Sensors_2 / 4 % 2;
Sensor2 = Sensors_2 / 4 % 2;
Sensor3 = Sensors_2 % 2;
但是,由于计算机二进制数是特殊的,所以二进制版本更常用这样编写:
int Sensors_2 = Sensor1 << 2 | Sensor2 << 1 | Sensor3;
...
Sensor1 = Sensors_2 >> 2 & 1;
Sensor2 = Sensors_2 >> 1 & 1;
Sensor3 = Sensors_2 & 1;
|
,<<
,>>
和&
是按位OR,shift和AND运算符,并解释它们的作用超出了这个问题的范围,但是注意它们:当没有&#34;重叠&#34;一位和数字为正,则|
的结果与+
的结果相同。
haccks的答案涵盖了如何让C编译器为您完成此操作,而无需进行自己的位操作。
要使用前导零打印Sensors_10
,您可以执行printf("%03d", Sensors_10);
。 C标准库没有直接打印二进制数的方法,所以你需要自己的代码逐个打印这些位,所以你也可以printf("%d%d%d", Sensor1, Sensor2, Sensor3);
。
答案 2 :(得分:0)
您可以使用2D int数组来存储值并在以后使用它。
E.g int sen_value[1000][3];
在循环中使用它来存储值。
示例如何在循环中使用它:
#include <stdio.h>
int main ()
{
int i;
int sen_value[10][3];
for(i=0;i<10;i++)
{
//Assigning the values
sen_value[i][0] = 0;
sen_value[i][1] = 0;
sen_value[i][2] = 0;
//Use the way you want
printf("%d %d %d\n",sen_value[i][0],sen_value[i][1],sen_value[i][2]);
}
return 0;
}
或者您可以只使用一次,然后在每次操作后重置它,例如:
#include <stdio.h>
int main ()
{
int sen_value[1][3];
//Assigning the values
sen_value[0][0] = 0;
sen_value[0][1] = 0;
sen_value[0][2] = 0;
//Use the way you want
printf("%d %d %d\n",sen_value[0][0],sen_value[0][1],sen_value[0][2]);
return 0;
}
答案 3 :(得分:0)
如果您使用的是 linux环境,则可以使用该命令轻松保存控制台中显示的输出。
让sensor.c成为您的源文件然后,
$ gcc -o a sensor.c
$ ./a > senser.txt
然后你有一个.txt文件,所有输出都存储在一个txt文件中。这些可以再次用作other.c文件中的输入,例如:
$ gcc -o other other.c
$ ./other < senser.txt
如果你想在内部存储那些sensor1,sensor2,sensor3并在内部使用,那么你可以简单地使用数组或结构,如:
main(){
int Sensor[1][3];
Sensor[0][0] = 0;
Sensor[0][1] = 1;
Sensor[0][2] = 0;
print ("%d%d%d", Sensor[0][0], Sensor[0][1], Sensor[0][2]);
}
答案 4 :(得分:0)
虽然在打印时不显示整数的前导零,但这并不意味着它们被删除&#34 ;;它们只是隐式的 - 这是在值的输出中使用的格式说明符而不是不存在的零的问题。 int总是固定数量的二进制数字。
考虑:
uint32_t sensor_state = (sensor3 << 3) | (sensor2 << 1) | sensor1 ;
请注意,uint32_t
是无符号整数长度为32位的类型别名。它通过包含<stdint.h>
头文件来定义。在这种情况下,普通int
可以工作,但是当您在位级处理数据时,最好是显式(和无符号)。当然,uint8_t
也可以使用,如果你的目标是8位设备,我建议你使用它。
此处sensor_state
是三个传感器值的二进制组合,并且具有以下值之一:
Sensors sensor_state
3 2 1 binary decimal hexadecimal
---------------------------------------
0 0 0 0000 0 0x00
0 0 1 0001 1 0x01
0 1 0 0010 2 0x02
0 1 1 0011 3 0x03
1 0 0 0100 4 0x04
1 0 1 0101 5 0x05
1 1 0 0110 6 0x06
1 1 1 0111 7 0x07
所以你可以打开任何组合:
switch( sensor_state )
{
case 0x00 :
...
break ;
case 0x01 :
...
break ;
case 0x02 :
...
break ;
...
case 0x07 :
...
break ;
default :
// unexpected invalid combination
break ;
}
您可以为每个组合创建一个枚举:
enum eSensorStates
{
NO_SENSOR = 0,
SENSOR1,
SENSOR2,
SENSOR12,
SENSOR3,
SENSOR13,
SENSOR23,
SENSOR123
}
然后你可以写:
switch( sensor_state )
{
case NO_SENSOR :
...
break ;
case SENSOR1:
...
break ;
case SENSOR2:
...
break ;
...
case SENSOR123 :
...
break ;
default :
// unexpected invalid combination
break ;
}
您当然可以使用在您的应用程序中具有特定意义的枚举名称 - 这些名称反映了每个组合的含义或操作,而不是我选择的通用名称。