从int存储零并稍后使用它们

时间:2014-10-11 04:39:56

标签: c

我有3个传感器,每个传感器提供0或1(循环重复)。它们作为int变量单独存储。然后使用以下内容打印这些:

print ("%d%d%d", Sensor1, Sensor2, Sensor3);

我想暂时存储每个组合(例如:010,001,110等)以便我可以使用它做其他事情(我希望有一个开关或最终我可以做不同操作的东西,具体取决于传感器组合的价值)。我无法将其存储为int,因为它会丢弃前面的0。

如何存储这些组合?

5 个答案:

答案 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 ;
}

您当然可以使用在您的应用程序中具有特定意义的枚举名称 - 这些名称反映了每个组合的含义或操作,而不是我选择的通用名称。

相关问题