从C中的二进制“components”构造一个int

时间:2011-05-02 22:51:29

标签: c arrays binary arduino

我有几个方程式将返回我的数字中三位中的每一位的二进制值。

我正在使用C编程,这对我来说是一种新语言。

我们假设我的等式返回Y0 = 1Y1 = 0Y2 = 1101);我想将该值存储为5

如果这些值由不同的方程式返回,那么这在C中是否可行?

我知道如何通过乘法来做到这一点,但我正在寻找一个我想象已经内置于C中的函数或其他东西。

4 个答案:

答案 0 :(得分:5)

没有这样的运气。你必须乘以(或移位,这是相同的)

unsigned Y0 = 1, Y1 = 0, Y2 = 1, val;

val = (Y0 * 4)  + (Y1 * 2)  + (Y2 * 1);  /* parens */
val = (Y0 << 2) + (Y1 << 1) + (Y2 << 0); /* redundant */

答案 1 :(得分:4)

Just bitshift:

Y0 | (Y1 << 1) | (Y2 << 2)

答案 2 :(得分:4)

C标准库中没有这样的功能。

你需要这样做:

int x = (Y2 << 2) | (Y1 << 1) | (Y0 << 0);

答案 3 :(得分:1)

虽然不是很受欢迎,但您确实有另一种选择,因为您可以使用位字段来执行您正在谈论的操作类型。因此,在ideone上,以下代码将执行您建议的操作。

union combine {
    struct bits{
        int x: 1;
        int y: 1;
        int z: 1;
        int pad : 29;
    } bitvalues;
    int value;
};

int main() {
    union combine test;
    test.bitvalues.x = 1;
    test.bitvalues.y = 0;
    test.bitvalues.z = 1;
    test.bitvalues.pad = 0;
    printf("result: %d\n", test.value);
    return 0;
}

然而,重要的是要注意,因为您使用的是位域和联合的组合,这不是便携式解决方案。它取决于您定义位的顺序,匹配该机器上整数的位/字节顺序。因此,有一种方法可以在没有位移的情况下完成,但是你几乎肯定会更好地使用位移解决方案。