我有几个方程式,每个方程式都会返回我的数字中三位的二进制值。
我正在使用C语言进行编程,这是一门对我来说比较新的语言。
假设我的方程式返回Y0 = 1
,Y1 = 0
和Y2 = 1
(101
); 我希望将该值存储为5
。
如果这些值由不同的方程式返回,那么在C语言中是否有可能实现呢?
我知道如何通过乘法来实现,但我正在寻找一种函数或类似于C中已经内置的东西。
没有这样的运气。您必须进行乘法(或移位,这是相同的)。
unsigned Y0 = 1, Y1 = 0, Y2 = 1, val;
val = (Y0 * 4) + (Y1 * 2) + (Y2 * 1); /* parens */
val = (Y0 << 2) + (Y1 << 1) + (Y2 << 0); /* redundant */
只需进行位移操作:
Y0 | (Y1 << 1) | (Y2 << 2)
在C标准库中没有这样的函数。
你需要做:
int x = (Y2 << 2) | (Y1 << 1) | (Y0 << 0);
虽然不是很流行,但你有另一种选择,即可以使用位域来执行你所说的操作类型。因此,在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;
}
需要注意的是,由于您正在使用位域和联合的组合,这不是一种可移植的解决方案。它取决于您定义位的顺序,匹配该机器上整数的位/字节顺序。因此,有一种方法可以避免位移,但您几乎肯定最好选择位移解决方案。