在C语言中,从二进制“组件”构造一个整数

3

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

我正在使用C语言进行编程,这是一门对我来说比较新的语言。

假设我的方程式返回Y0 = 1Y1 = 0Y2 = 1101); 我希望将该值存储为5

如果这些值由不同的方程式返回,那么在C语言中是否有可能实现呢?

我知道如何通过乘法来实现,但我正在寻找一种函数或类似于C中已经内置的东西。

4个回答

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 */

4

只需进行位移操作:

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

4

在C标准库中没有这样的函数。

你需要做:

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

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

需要注意的是,由于您正在使用位域和联合的组合,这不是一种可移植的解决方案。它取决于您定义位的顺序,匹配该机器上整数的位/字节顺序。因此,有一种方法可以避免位移,但您几乎肯定最好选择位移解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接